提问者:小点点

C++-offsetof函数,为什么可以只传递成员名


当我像这样定义结构时:

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不是一个字符串或关键字,它不是语言定义的任何数据类型,也不是一个类,那么编译器是如何发现它不只是一些随机的东西的呢?

如果可能的话,请提到一个特定的宏是如何被编译器实现的?


共2个答案

匿名用户

因为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++的特性,而是依赖于能够访问自己实现的编译器。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++-offsetof|函数|传递|成员|名)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?