2017-11-28 9 views
1

내가 C. 예 내에서 구조의 변수 이름을 찾기 위해 노력하고있다 :만들기 컴파일 시간 변수 오프셋지도

def.h

typedef struct 
{ 
    int fov_one; 
    int fov_two; 
    int timing_chain; 
    ... 
    ... 
    float ratio; 
    float spare_floats[15]; 
}PARAMETERS; 
구조가 최대 200 개 매개 변수에 대한 장소를 보유하고

을, 이 중 일부는 현재 사용 중입니다. 현재 구조 PARAMETERS 내의 값은 2 진 파일로 채워집니다. 그러나 일부 사용자는 채워진 후 런타임에 하나 또는 두 개의 값을 변경하려고합니다. 변수 이름의 문자열 버전을 기반으로 값을 변경하는 옵션을 만들고 싶습니다. 예를 들어 변수 비율을 변경하려면 사용자가 문자열 "비율 .25"를 입력하고 "비율"의 현재 값을 ".25"로 바꿀 수 있기를 바랍니다.

내가 읽은 바로는 리플렉션이 없기 때문에 C에서 변수 이름의 문자열 버전을 기반으로 변수를 찾을 수 없습니다. 현재, 내 생각은 변수 이름을 얻기 위해 머리글을 구문 분석하는 것입니다,하지만 누군가가 그것을 스트라이핑되기 전에 링커에서 이름을 얻을 수 있습니다 언급했다. 컴파일러/링커는 컴파일하는 동안 변수 이름을 제거하고 기호를 사용하지 않고 변수에 액세스하기 위해 주소를 사용합니다.

컴파일러/링커에서 만드는 변수 이름과 오프셋이 포함 된 심볼 맵을 인쇄 할 수 있는지 알고 싶습니다. GCC의 옵션

gcc -o foo foo.c -Wl,Map,foo.map 

를 사용

는지도를 작성하지만 구조의 변수 이름을 포함하지 않습니다.

컴파일 타임에 컴파일러/링커에서 생성 한 가변 오프셋 맵을 추출 할 수 있습니까?

+0

필드의 이름은 컴파일 타임에 알려 지므로이 200 개의 필드와이를 업데이트하고 함께 매핑하는 데 사용되는 키워드 각각에 대해 알고있는 함수를 만들어야합니다. – dbush

답변

1

구조체 오프셋은 DWARF 출력 (또는 대상 사용자의 디버깅 형식)의 일부로 사용할 수 있습니다. 컴파일러 플러그인에서도 사용할 수 있습니다.

그러나 문자열을 기반으로 PARAMETERS 개의 개체를 업데이트하는 직접 코드를 작성하거나 생성하는 것이 더 쉽습니다. 필드 이름의 문자열을 offsetof 값으로 나열하여 좀 더 간결한 표현을 만들 수 있습니다.

+1

게다가 사용자 수준에서 적어도 구성원 중 일부는 코드에서 사용되는 것보다 더 나은 이름을 가진 것으로 보입니다. 나는 기억해야한다. " – SoronelHaetir

0

소스 코드를 제어하므로 컴파일 타임에 "이름을 오프셋 (offset)"맵으로 생성하는 것이 일반적입니다. 예를 들어

:

// parameter_fields.inc -- describes fields in struct PARAMETERS 
xxx(int, fov_one) 
xxx(int, fov_two) 
... 
xxx(float, ratio) 

// def.h 
struct _PARAMETERS { 
#define xxx(a, b) a b; 
    #include "parameter_fields.inc" 
#undef xxx 
} PARAMETERS; 

// in somefile.c 
#include <stddef.h> 
#include "def.h" 

struct { 
    const char *name; 
    int offset; 
} PARAMETER_OFFSETS[] = { 
#define xxx(a, b) #b, __offsetof__(struct _PARAMETERS, b), 
    #include "parameter_fields.inc" 
#undef xxx 
}; 

이제 PARAMETER_OFFSETS 배열의 일부로서 코드에 오프셋 쉽게 사용할 수 있습니다.