当我像这样定义结构时:
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
不是一个字符串或关键字,它不是语言定义的任何数据类型,也不是一个类,那么编译器是如何发现它不只是一些随机的东西的呢?
如果可能的话,请提到一个特定的宏是如何被编译器实现的?
因为offsetof是一个宏,所以在宏定义内部,字段名将与您传入的类型一起使用。 它看起来是这样的:
#define offsetof(st, m) \
((size_t)&(((st *)0)->m))
来源:https://en.wikipedia.org/wiki/offsetof
我不明白你的大部分问题,但题目是:
offsetof函数,为什么可以只传递成员名
offsetof(abc, arr_member1)
来自CPPreference:
offsetof无法在标准C++中实现,需要编译器支持
它不能在stadard C++中实现的原因是,在类ARR_Member1
之外没有实体。 只是成员的名字。 编译器知道类成员的名称,但是ARR_MEMER1
(在类之外)没有任何东西可以使用。 C++具有指向成员的指针,但offsetof
不将指向成员的指针作为参数。 这是一个讨厌的宏,它不是基于C++的特性,而是依赖于能够访问自己实现的编译器。