题
在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_t对象:编译器只能计算sizeof操作数的静态类型,它不会执行表达式。
这适用于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;
}
Trick将0视为指向结构的指针。这在编译时解决,因此安全。
你可以轻松做到
sizeof(myStruct().x)
由于从不执行sizeof参数,因此您不会真正创建该对象。
任何这些都应该有效:
sizeof(myStruct_t().x;);
或
myStruct_t *tempPtr = NULL;
sizeof(tempPtr->x)
或
sizeof(((myStruct_t *)NULL)->x);
因为 sizeof
是在编译时计算的,而不是运行时,所以解释引用NULL指针时不会有问题。
在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);
不隶属于 StackOverflow