C中Sizeof运算符的复杂声明

Ani*_*rya 0 c macros sizeof c-preprocessor

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

#define SIZEOF(int)  (int)&((int *)0)[1]
Run Code Online (Sandbox Code Playgroud)

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

Pub*_*bby 6

这是[1]"扩展"部分:

(int)(&(*(((int*)0) + 1)))
Run Code Online (Sandbox Code Playgroud)

现在你看看它是如何工作的?

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

虽然它是完全未定义的行为(对null的算术以及可能是无效指针的取消引用),但是相当没有意义.


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

  • +1用于指定未定义的行为. (3认同)
  • @PaulR啊,似乎问题被编辑了.宏现在更没意义了. (2认同)