随笔 - C 语言中的编译期检测版 assert "-!!(e)"

https://stackoverflow.com/questions/9229601/what-is-in-c-code 看到个有趣的东西

众所周知,assert() 会在程序运行到相关代码时检验返回值的值,如果为 0 则终止程序运行并输出指定错误信息

实际上,我们可以通过如下手段实现在编译期进行检验

_static_assert.cview raw
1
#define _static_assert(exp) sizeof(struct { int: -!!(exp); })

我们把它拆开来看

  • !!(exp): 如果 exp == 0, 则该部分为 0, 否则为 1
  • -!!(exp): 取反,如果 exp == 0, 则该部分为 0, 否则为 -1
  • int: -!!(exp);: 如果 exp == 0, 则该部分为 int: 0;, 否则为 int: -1;

到这里就已经很清楚了,占 -1 个位的变量自然是无法声明的,而占 0 个位的变量可以声明,且不会对程序造成任何影响

如果看不懂可以自行搜索位域 (bitfield)