【发布时间】:2020-06-28 14:30:14
【问题描述】:
当我定义这样的结构时:
struct abc{
int member1;
int arr_member1;
std::vector<int> mVector;
}
并且想要创建一个arr_member 变量,我必须这样做:
abc x;
x.member1=3;
x.arr_member1= ...
//some more code
但我不能这样做:
arr_member1 a = //some code
其中 a 应该是一个由 5 个元素组成的 int 数组的变量。
但是,我怎样才能为 offsetof() 函数做到这一点:
offsetof(abc, arr_member1)
我可以理解abc 指的是一个结构类型,但从技术上讲,arr_member 是什么?这叫什么?指针、类型、成员类型?这个宏扩展成什么,编译器如何编译它?
我的意思是,arr_member 不是字符串或关键字,它不是由语言或类定义的任何数据类型,那么编译器如何确定它不仅仅是一些随机的东西?
如果可能,请说明编译器如何实现特定的宏?
【问题讨论】:
-
arr_member1 a没有任何意义,因为arr_member1没有命名类型。你真正想要实现什么,offsetof与它有什么关系? -
你确定你不是在寻找类似
decltype的东西吗? -
offsetof不能在 c++ 中实现(它是魔法,标准只是说明了它应该做什么)。如果您要询问特定编译器如何实现它,请澄清问题并添加适当的标记。 -
offsetof是一个宏。它使用其参数执行一些文本替换,最终生成编译器可以理解的有效代码。 -
我不确定我是否完全理解这种区别。 Name lookup 是编译器根据 C++ 语言标准规定的规则执行的过程。这是一个将给定名称的使用与该名称的先前声明相匹配的过程,以确定该名称在给定上下文中所指的实体。
标签: c++