3

我想知道一个简单的宏是否offset_of_需要指针取消引用。例如,一个C++(意味着此代码将使用 C++ 编译器编译)结构体,它使用打包属性声明

struct A {
  int x;
  int y;
} __attribute__(packed);

假设sizeof(int) == 4在这种情况下,为了计算yinside的偏移量A,我编写了一个简单的宏:

#define offset_of_y (ptrdiff_t)(&(((A*)0)->y))

我们能确定这个宏的值总是4吗?调用宏时是否有任何指针取消引用0(可能是 UB)?

非常感谢您的任何回复。

4

1 回答 1

3

通过空指针访问某些东西是 UB,句号。

(除非上下文未被评估,但在这种情况下它被评估。)

你可能想要offsetof().


在实践中,您的代码可能可以工作,但正式地它是未定义的。

于 2018-07-26T16:53:44.853 回答