c++ - 获取成员变量的大小
问题描述
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?
解决方案
推荐阅读
- java - 如何在 VS 代码的调试控制台中而不是在我的终端上打印日志消息?
- nlp - 使用 pytorch 闪电对 BERT 模型进行多标签文本分类会导致 DataLoader 中出现 KeyError
- amazon-web-services - 为什么一个 group by 的聚合这么慢?
- android-studio - 短信管理员 getSmsManagerForSubscriptionId
- css - 文字描边线css
- julia - 为什么当我调用两次并且编译次数占用率低时性能不同?
- swift - 如何使 NavigationLink 以另一个视图中的布尔集为条件?
- javascript - react中如何分离功能组件的逻辑?
- bash - Bash脚本:获取输入参数的数量,不包括选项
- python - 在屏蔽语言建模期间屏蔽每个输入句子中的特定标记