2009-09-09 2 views
4

C/C++에서 구조체 유형의 더미 변수를 정의하지 않고도 구조체에 대한 멤버 변수의 크기를 어떻게 결정합니까? 여기에 잘못 수행하는 방법의 예이지만, 의도을 보여줍니다구조체 멤버의 크기를 결정하는 일반적인 C/C++ 매크로는 무엇입니까?

myStruct_t dummyStructVar; 

const size_t sizeof_MyStruct_x = sizeof(dummyStructVar.x); 
: 참고로

typedef struct myStruct { 
    int x[10]; 
    int y; 
} myStruct_t; 

const size_t sizeof_MyStruct_x = sizeof(myStruct_t.x); // error 

을, 이것은 당신이 먼저 더미 변수를 정의하면 'X'의 크기를 찾는 방법이어야한다

그러나 'x'의 크기를 얻기 위해 더미 변수를 만들지 않으려합니다. 멤버 변수 'x'의 크기를 찾는 데 도움이되는 myStruct_t로 0을 재 작성하는 영리한 방법이 있다고 생각하지만 세부 사항을 잊어 버린만큼 길었고 좋은 Google 검색을 얻을 수없는 것 같습니다. . 아십니까?

감사합니다.

(태그가 무슨 말을입니다) C++에서

답변

18

, 당신의 "더미 변수"코드로 대체 할 수 있습니다

sizeof myStruct_t().x; 

없음 myStruct_t 객체가 생성되지 않습니다 : 컴파일러는 sizeof 연산자 년대의 정적 유형을 작동 피연산자, 그것은 표현을 실행하지 않습니다.

이 C에서 작동하고, 또한 접근 인자없는 생성자없이 클래스를 작동하기 때문에 C++이 더 나은에서 :

sizeof ((myStruct_t *)0)->x 
+0

Cool!이것은 C++에서 나를 위해 일했습니다. C 언어로도 할 수있는 방법이 있습니까? –

+0

및 C? 나는 이것을 필요로하지 않지만 정말로 알고 싶다 :-) – p4bl0

+1

+1은 매크로를 사용하지 않고 혼란을 가중시킨다. – Kredns

3

를 sizeof 매개 변수이기 때문에 쉽게

sizeof(myStruct().x) 

할 수 결코 실행되지 않으면, 당신은 실제로 그 객체를 생성하지 않을 것입니다.

3

이들의 상관 작동합니다 :

sizeof(myStruct_t().x;); 

또는

myStruct_t *tempPtr = NULL; 
sizeof(tempPtr->x) 

또는

sizeof(((myStruct_t *)NULL)->x); 

sizeof이 컴파일시에 평가되기 때문에, 런타임을하지, 당신은 '원 NULL 포인터를 dereferencing하는 데 문제가 있습니다.

11

나는 매크로 다음 사용하고 있습니다 :

#include <iostream> 
#define DIM_FIELD(struct_type, field) (sizeof(((struct_type*)0)->field)) 
int main() 
{ 
    struct ABC 
    { 
     int a; 
     char b; 
     double c; 
    }; 
    std::cout << "ABC::a=" << DIM_FIELD(ABC, a) 
       << " ABC::c=" << DIM_FIELD(ABC, c) << std::endl; 

    return 0; 
} 

트릭은 구조체에 대한 포인터로 0을 치료한다. 이것은 컴파일시에 해결되므로 안전합니다. 내 유틸리티 매크로에서

+0

좋습니다! 그게 내가 찾고 있던 매크로 였어! –

0

는 헤더 :

#define FIELD_SIZE(type, field) (sizeof(((type *)0)->field)) 

은과 같이 호출 :

FIELD_SIZE(myStruct_t, x); 
1

C++ 11에서, 이것은 sizeof(myStruct_t::x) 수행 할 수 있습니다. C++ 11에는 std::declval이 추가되어 있습니다 (다른 것 중에서).