컴파일 타임에 구조체 멤버의 오프셋을 찾는 방법이 있습니까? 구조체 멤버의 오프셋을 포함하는 상수를 만들려고합니다. 다음 코드에서 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;
}
"컴파일 시간"이란 의미는 아닙니다. 라이브러리 함수를 사용하지 않는 구문을 보여 주지만 컴파일 시간 값으로 평가한다는 의미는 아닙니다. 코드가 실제로 출력되는지의 여부는 물론 무관하다. C 초안은 "산술 상수 표현은 산술 형을 가져야하며 정수 상수, 부동 상수, 열거 상수, 문자 상수 및 크기 표현식 인 피연산자 만 가져야한다." 믹스에서는 포인터가 허용되지 않습니다. –
'offsetof'는 컴파일 타임 구조이며 정수 상수 표현식으로 평가되지만 예제 구현에서는 그렇지 않습니다. –
offsetof()를 정수 상수 표현식으로 평가하는 것으로 정의하는 언어에는 * NO * 방식이 있습니다. 포인터를 사용하지 않고 정의하는 * NO * 방법이 있습니다. 당신이 무엇을 하든지간에, 당신은 항상 컴파일러 내장 함수 나 컴파일러가 표현을 적절하게 최적화 할 수있는 능력에 의존 할 것입니다. offsetof 또는 다른 오픈 소스 C 라이브러리에서 Wikipedia를 확인하십시오. 따라서, 정수 상수 표현식의 정의에 대해 기술적으로 올바르지 만 (그리고 필자의 말을 그대로 적용 함), 필자의 예제 구현에서 손가락을 가리키는 것이 잘못되었습니다. – DevSolar