随笔 - C 语言中的编译期检测版 assert "-!!(e)"
在 https://stackoverflow.com/questions/9229601/what-is-in-c-code 看到个有趣的东西
众所周知,assert()
会在程序运行到相关代码时检验返回值的值,如果为 0
则终止程序运行并输出指定错误信息
实际上,我们可以通过如下手段实现在编译期进行检验
1 |
我们把它拆开来看
!!(exp)
: 如果exp == 0
, 则该部分为0
, 否则为1
-!!(exp)
: 取反,如果exp == 0
, 则该部分为0
, 否则为-1
int: -!!(exp);
: 如果exp == 0
, 则该部分为int: 0;
, 否则为int: -1;
到这里就已经很清楚了,占 -1
个位的变量自然是无法声明的,而占 0
个位的变量可以声明,且不会对程序造成任何影响
如果看不懂可以自行搜索位域 (bitfield)