首页 > 解决方案 > 获取成员变量的大小

问题描述

g++-4.1 和之前的版本中有一个错误,导致它拒绝以下有效程序

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() {}

我需要使用这个旧版本的 g++ 编写要编译的可移植代码(以及其他代码),所以我想出了以下内容

#define sizeofmember(type, member) sizeof(static_cast<type*>(0)->member)
unsigned long long f() { return sizeofmember(S,n); }

我知道精心制作的type*NULL 指针不会被取消引用,因为:

[expr.sizeof]/1

sizeof运算符产生由 [...] 其操作数类型占用的字节数。操作数要么是一个表达式,它是一个未计算的操作数([expr.prop]),要么是一个带括号的类型 ID。

[expr.context]/1

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

但它有效吗?从 C++98 到 C++14?

标签: c++c++14language-lawyerc++98

解决方案


推荐阅读