C++ 什么是常见的C/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;
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);