구조 부재의 크기를 결정하기위한 일반적인 C/C ++ 매크로 란 무엇입니까?
문제
C/C ++에서 해당 구조 유형의 더미 변수를 정의 할 필요없이 멤버 변수의 크기를 구조로 결정하려면 어떻게해야합니까? 다음은 잘못 수행하는 방법의 예는 있지만 의도를 보여줍니다.
typedef struct myStruct {
int x[10];
int y;
} myStruct_t;
const size_t sizeof_MyStruct_x = sizeof(myStruct_t.x); // error
참고로 더미 변수를 먼저 정의하면 'X'의 크기를 찾는 방법이어야합니다.
myStruct_t dummyStructVar;
const size_t sizeof_MyStruct_x = sizeof(dummyStructVar.x);
그러나 'x'크기를 얻기 위해 더미 변수를 만들지 않아도됩니다. 멤버 변수 'X'의 크기를 찾는 데 도움이되는 MyStruct_T로 0을 재구성하는 영리한 방법이 있다고 생각하지만 세부 사항을 잊어 버릴 정도로 길었고 Google 검색을 잘 찾을 수없는 것 같습니다. . 알아?
감사!
해결책
C ++ (태그가 말하는 것)에서 "더미 변수"코드를 대체 할 수 있습니다.
sizeof myStruct_t().x;
myStruct_t 객체가 생성되지 않습니다. 컴파일러는 정적 유형의 피연산자 만 작동하며 표현식을 실행하지 않습니다.
이것은 C에서 작동하며 C ++에서는 액세스 할 수있는 No-Args 생성자없이 클래스에 대해 작동하기 때문에 더 좋습니다.
sizeof ((myStruct_t *)0)->x
다른 팁
다음 매크로를 사용하고 있습니다.
#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을 구조물에 대한 포인터로 취급합니다. 이것은 컴파일 시간에 해결되므로 안전합니다.
당신은 쉽게 할 수 있습니다
sizeof(myStruct().x)
매개 변수의 크기가 실행되지 않으므로 실제로 해당 객체를 만들지 않을 것입니다.
이 중 하나는 다음과 같습니다.
sizeof(myStruct_t().x;);
또는
myStruct_t *tempPtr = NULL;
sizeof(tempPtr->x)
또는
sizeof(((myStruct_t *)NULL)->x);
왜냐하면 sizeof
런타임이 아닌 컴파일 타임에 평가되므로 널 포인터를 수반하는 데 문제가 없습니다.
C ++ 11에서는이 작업을 수행 할 수 있습니다. sizeof(myStruct_t::x)
. C ++ 11도 추가합니다 std :: declval, 이것에 사용될 수 있습니다 (무엇보다도) :
#include <utility>
typedef struct myStruct {
int x[10];
int y;
} myStruct_t;
const std::size_t sizeof_MyStruct_x_normal = sizeof(myStruct_t::x);
const std::size_t sizeof_MyStruct_x_declval = sizeof(std::declval<myStruct_t>().x);
내 유틸리티 매크로 헤더에서 :
#define FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
그렇게 호출 :
FIELD_SIZE(myStruct_t, x);