什么是常见的C/C++宏来确定结构成员的大小?

Mat*_*all 4 c++ sizeof

在C/C++中,如何确定结构的成员变量的大小,而无需定义该结构类型的虚拟变量?这是一个如何做错的例子,但显示了意图:

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

const size_t sizeof_MyStruct_x = sizeof(myStruct_t.x);  // error
Run Code Online (Sandbox Code Playgroud)

作为参考,如果你首先定义一个虚拟变量,这应该是如何找到'x'的大小:

myStruct_t dummyStructVar;

const size_t sizeof_MyStruct_x = sizeof(dummyStructVar.x);
Run Code Online (Sandbox Code Playgroud)

但是,我希望避免为了获得'x'的大小而创建一个虚拟变量.我认为有一种聪明的方法可以将0重新设置为myStruct_t,以帮助找到成员变量'x'的大小,但是已经足够长,以至于我忘记了细节,似乎无法在这方面获得良好的Google搜索.你知道吗?

谢谢!

Ste*_*sop 18

在C++中(这是标签所说的),您的"虚拟变量"代码可以替换为:

sizeof myStruct_t().x;
Run Code Online (Sandbox Code Playgroud)

不会创建myStruct_t对象:编译器只能处理sizeof操作数的静态类型,它不会执行表达式.

这适用于C,并且在C++中更好,因为它也适用于没有可访问的no-args构造函数的类:

sizeof ((myStruct_t *)0)->x
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,sizeof(myStruct_t :: x)将在c ++ 0x(源维基百科)中工作 (2认同)

Dew*_*wfy 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;
}
Run Code Online (Sandbox Code Playgroud)

Trick将0视为指向结构的指针.这在编译时解决,因此它是安全的.