구조 부재의 크기를 결정하기위한 일반적인 C/C ++ 매크로 란 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1400660

  •  05-07-2019
  •  | 
  •  

문제

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);  
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top