2009-09-04 4 views
7

컴파일 타임에 구조체 멤버의 오프셋을 찾는 방법이 있습니까? 구조체 멤버의 오프셋을 포함하는 상수를 만들려고합니다. 다음 코드에서 offsetof() 매크로는 첫 번째 printf 문에서 작동합니다.컴파일시 offsetof

"Cannot resolve '->' operator as a constant expression".

그 일을 어떤 다른 방법이 있나요 : 그러나, ofs을 선언하는 라인 (10)의 사용은 오류를 생성?

struct MyStruct 
{ 
    unsigned long lw; 
    unsigned char c[5]; 
    int i; 
    int j; 
    unsigned long last; 
}; 

const int ofs = offsetof(struct MyStruct, i); // This line in error 

int main(void) 
{ 
    printf("Offset of c = %d.\n", offsetof(struct MyStruct, c)); 
    printf("Offset of i = %d.\n", ofs); 
    return 0; 
} 

답변

4

올바른 #includes를 추가 한 후 g ++ 4에서 경고없이 컴파일됩니다.

#including stddef.h? offsetof()는 C의 내장 키워드가 아닌 매크로입니다.

문제가 해결되지 않으면 상수를 정적으로 만들어 모듈에 제한하십시오. 컴파일러를 행복하게 만들 수 있습니다.

9

offsetof() 매크로 은 컴파일 시간 구문 인입니다. 표준을 정의하는 방법은 없지만 모든 컴파일러는이를 수행 할 수있는 방법이 있어야합니다.

한 예는 다음과 같습니다

#define offsetof(type, member) ((size_t) &(((type *) 0)->member)) 

기술적으로를 구성, 모든 컴파일러가 적어도 하나 개 같은 표현이 있어야합니다 (사용자 "litb"으로 설명 참조) 컴파일 시간이없는 동안 정확히 offsetof()이 <stddef.h>에 정의 된 컴파일 시간에 해결할 수 있습니다.

코드에 다른 오류가있을 수 있습니다. 누락 된 코드는 <stddef.h>이거나 컴파일러를 자극하는 것입니다.

+0

"컴파일 시간"이란 의미는 아닙니다. 라이브러리 함수를 사용하지 않는 구문을 보여 주지만 컴파일 시간 값으로 평가한다는 의미는 아닙니다. 코드가 실제로 출력되는지의 여부는 물론 무관하다. C 초안은 "산술 상수 표현은 산술 형을 가져야하며 정수 상수, 부동 상수, 열거 상수, 문자 상수 및 크기 표현식 인 피연산자 만 가져야한다." 믹스에서는 포인터가 허용되지 않습니다. –

+0

'offsetof'는 컴파일 타임 구조이며 정수 상수 표현식으로 평가되지만 예제 구현에서는 그렇지 않습니다. –

+0

offsetof()를 정수 상수 표현식으로 평가하는 것으로 정의하는 언어에는 * NO * 방식이 있습니다. 포인터를 사용하지 않고 정의하는 * NO * 방법이 있습니다. 당신이 무엇을 하든지간에, 당신은 항상 컴파일러 내장 함수 나 컴파일러가 표현을 적절하게 최적화 할 수있는 능력에 의존 할 것입니다. offsetof 또는 다른 오픈 소스 C 라이브러리에서 Wikipedia를 확인하십시오. 따라서, 정수 상수 표현식의 정의에 대해 기술적으로 올바르지 만 (그리고 필자의 말을 그대로 적용 함), 필자의 예제 구현에서 손가락을 가리키는 것이 잘못되었습니다. – DevSolar

3

#include <stddef.h>이있는 경우 (인용하지 않은 오류 메시지는 의미가 없습니다) 컴파일러의 버그입니다. offsetof 결과는 C99뿐만 아니라 C99에서도 정수 상수 표현입니다.