在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)
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视为指向结构的指针.这在编译时解决,因此它是安全的.
| 归档时间: |
|
| 查看次数: |
4429 次 |
| 最近记录: |