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

C++ 什么是常见的C/C++;宏来确定结构成员的大小?,c++,sizeof,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 作为参考,这应该是如何在您首先定义虚拟变量时找到“x”的大小: myStruct_t dummyStructVar;

在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”的大小而创建一个虚拟变量。我认为有一种聪明的方法可以将0改写为myStruct\t,以帮助查找成员变量“x”的大小,但时间太长了,我已经忘记了细节,似乎无法在谷歌上进行良好的搜索。你知道吗

谢谢

> C++中(标签所示),你的“哑变量”代码可以用:

替换。
sizeof myStruct_t().x;
不会创建myStruct\u t对象:编译器只计算sizeof操作数的静态类型,不执行表达式

这在C中工作,C++中更好,因为它也适用于没有可访问的无ARGS构造函数的类:

sizeof ((myStruct_t *)0)->x
你很容易做到

sizeof(myStruct().x)

由于sizeof参数从未执行过,因此您不会真正创建该对象。

以下任何一项都可以工作:

sizeof(myStruct_t().x;);


因为
sizeof
是在编译时而不是运行时计算的,所以取消对空指针的引用不会有问题。

我使用以下宏:

#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;
}
#包括
#定义尺寸字段(结构类型,字段)(sizeof(((结构类型*)0)->字段))
int main()
{
结构ABC
{
INTA;
字符b;
双c;
};

std::cout来自我的实用程序宏标题:

#define FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
这样调用:

FIELD_SIZE(myStruct_t, x);  

在C++11中,这可以通过
sizeof(myStruct\u t::x)
来完成。C++11还添加了一些功能,这些功能可以用于此(除其他外):

#包括
typedef结构myStruct{
int x[10];
int-y;
}我的结构;
常量std::size\u t sizeof\u MyStruct\u x\u normal=sizeof(MyStruct\u t::x);
const std::size\t sizeof\u MyStruct\u x\u declval=sizeof(std::declval().x);

<代码> >酷!这在C++中对我来说是有效的。C还有一种方法吗?C是什么?我不需要这个,但是我很想知道:-第一种方法显然只对具有可访问默认构造函数(隐式或显式)的结构进行工作。第二种方法是通用的,并且在C和C++中都是相同的。顺便说一下,SigeOf(myStruct_t::x)将在c++0x(源维基百科)中工作@Pavel:好的,我的第一个代码片段实际上只是制作了“虚拟变量”代码在不执行构造函数的情况下工作。@Lucas,这个问题确实需要一个宏,所以我不怪那些提供宏的人。但是提问者听起来很聪明,我能处理这部分。很好!这就是我要找的宏!
#define FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
FIELD_SIZE(myStruct_t, x);  
#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);