我正在阅读offsetof的参考,并看到以下内容:
给定类型为具有静态存储持续时间的对象
o
,&(o.member)
应为常量表达式,并指向o
的子对象否则,行为未定义特别是,如果成员是静态数据成员、位字段或成员函数,则行为是未定义的。
我的第一个问题是,为什么这会出现在offsetof的引用中,因为我看不出它与offsetof有任何明显的相关性。
第二,关于上面引用的重点;否则";意思是这是否意味着对于具有自动或动态存储持续时间的对象o
,&(o.member)
是未定义的?我以为这样的表达是合法的,我是不是遗漏了什么?还是因为括号?
相关性在于,这说明了offsetof
的要求。不用说,你不能传递两个任意的参数并给出有意义的结果。因此,offsetof
的要求是通过一个例子来说明的。offsetof
是这样指定的:
#define offsetof(type, member) ...
宏的第一个参数的名称是type
,第二个参数的名字是member
。有了这些:
给定具有静态存储持续时间的类型为o的对象,。。。
这概述了需求:假设您有一个类型为type
(宏的第一个参数(的o
的static
对象,此外:
&(o.member(应为常数表达式,并指向o.的子对象
。。。这意味着,在这种情况下,如果o.member
也是一个常量表达式,并且引用了一些";子对象";,又称o
的成员,属于type
类型。。。
那么这就是这个宏的要求,以便offsetof
给您指定的结果。
你问:
什么是"否则";意思是
这里,";否则";指除满足上述所有条件之外的任何其他条件。