C中Sizeof运算符的复杂声明

时间:2012-06-03 11:31:40

标签: c macros c-preprocessor sizeof

我在书中的某个地方看到了这个复杂的sizeof运算符声明,这让我很开心:

#define SIZEOF(int)  (int)&((int *)0)[1]

任何人都可以解释这个声明,这里发生了什么......?

3 个答案:

答案 0 :(得分:6)

这是[1]部分'展开':

(int)(&(*(((int*)0) + 1)))

现在看看它是如何运作的?

由于指针算法的属性,0会增加sizeof int,最终的int强制转换会获得结果地址的值,即'size'

虽然这是完全未定义的行为(对null的算术以及可能是无效指针的解除引用),但是没有用。


使用宏参数进行更新没有多大意义。最终演员应该是std::uintptr_t

答案 1 :(得分:4)

首先 - 它与术语int混淆了 - 我们自然地假设它是熟悉类型的关键字,但是在这种情况下它不是 - 相反,它是宏的参数。所以为了简化,请考虑如下宏:

#define SIZEOF(type)  &((type *)0)[1]

现在以这种方式看待它,可能更容易看到宏首先将地址0转换为指向type的指针,然后它将获取第二个元素的地址。这将显示尺寸。

答案 2 :(得分:1)

它将SIZEOF定义为整数的大小。

  • (int *)0是地址为零的int指针
  • [1]在此之后访问 next 整数。
  • 由于(int *)0的地址为零,因此地址为sizeof int之后,地址为(int),因为它位于前一个地址之后。
  • sizeof int将其转换为数字,因为大小是数字,而不是指针。

显然这是一个讨厌的黑客,应该只使用{{1}}。