我在书中的某个地方看到了这个复杂的sizeof运算符声明,这让我很开心:
#define SIZEOF(int) (int)&((int *)0)[1]
任何人都可以解释这个声明,这里发生了什么......?
答案 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}}。