C++ 获取成员变量的大小

C++ 获取成员变量的大小,c++,c++14,language-lawyer,c++98,C++,C++14,Language Lawyer,C++98,g++-4.1及之前版本中存在一个bug,导致: 我需要编写可移植代码,以便使用这个旧版本的g++进行编译(除其他外),因此我想到: #定义sizeofmember(类型、成员)sizeof(静态_cast(0)->成员) 无符号长f(){return sizeofmember(S,n);} 我知道特制的type*NULL指针不会被取消引用,因为: sizeof运算符生成其操作数类型[…]占用的字节数。操作数可以是一个表达式,它是一个未赋值的操作数([expr.prop]),也可以是一个带括号

g++-4.1及之前版本中存在一个bug,导致:

我需要编写可移植代码,以便使用这个旧版本的g++进行编译(除其他外),因此我想到:

#定义sizeofmember(类型、成员)sizeof(静态_cast(0)->成员)
无符号长f(){return sizeofmember(S,n);}
我知道特制的
type*
NULL指针不会被取消引用,因为:

sizeof
运算符生成其操作数类型[…]占用的字节数。操作数可以是一个表达式,它是一个未赋值的操作数([expr.prop]),也可以是一个带括号的type-id

在某些上下文中,会出现未计算的操作数([expr.prim.req]、[expr.typeid]、[expr.sizeof]、[expr.unary.noexcept]、[dcl.type.simple]、[temp])。不计算未计算的操作数。[ 注意:在未赋值操作数中,可以命名非静态类成员([expr.prim.id]),而对象或函数的命名本身并不要求提供定义([basic.def.odr])。未赋值操作数被视为完整表达式- 尾注 ]


但是它是否有效?从C++98到C++14?

相关/重复:和@YSC答案是否很棒以及是否是同一个问题是两个不同的问题。结束这个问题并用更好的答案回答另一个问题比将目标减半更有用answered@BaummitAugen没错,完了!我不明白这个问题。为什么您认为它可能不“有效”?sizeof的参数没有计算,它的类型才是最重要的。@YSC:如果您有一个
T*
类型的指针
p
,那么
sizeof(*p)
等于
sizeof(T)
p
是否为空并不重要。表达式的类型很重要,表达式本身不会被计算。
struct S { int n; };
unsigned long long f() { return sizeof S::n; }
    // ^--g++-4.1 "error: invalid use of non-static data member 'S::n'"
int main() {}
#define sizeofmember(type, member) sizeof(static_cast<type*>(0)->member)
unsigned long long f() { return sizeofmember(S,n); }