断言就是声明某种东西应该为真。
assert的原型如下:
void assert(int expression)
当它被执行时,就对表达式进行测试,如果为假,则向标准错误打印一条诊断信息并终止程序。如果为真则继续执行程序。
断言使得调试程序变得容易,当程序调试完毕后,我们可以在编译时通过定义NDEBUG消除所有的断言。可以使用-DNDEBUG编译器命令行选项或者在源文件中头文件assert.h被包含前增加下面的这个定义:
#define NDEBUG
这样的为何能去掉代码中的断言呢?通过查看assert.h头文件发现:
#ifdef NDEBUG
#define assert(_Expression) ((void)0)
#else /* NDEBUG */
把assert()定义成了((void)0)
((void)0)其实就行一条空语句。这里,为什么不能这样:
#ifdef NDEBUG
#define assert(_Expression)
#else /* NDEBUG */
a = 1, assert(b == 1), c = 2;
// 变成这样 a = 1, , c = 2;
逗号表达式就出错了。因此空语句使用((void)0)更合适。