这个头文件里,只有一个函数(实际是一个宏函数),那就是void assert(int exp);函数,那么这个函数到底是干什么用的呢?我们来聊聊,聊之前我们先认识并使用(学习)下此函数,如下:
【宏函数:assert 】
【格式】
void assert(int exp);
【功能】
assert宏用于为程序增加诊断功能。当assert(exp)执行时,如果exp为0,则在标准出错输出流stderr输出一条如下所示的信息:
Assertion failed: expression, file filename, line nnn
然后调用abort终止执行。其中的源文件名filename和行号nnn来自于预处理宏__FILE__和__LINE__。
如果<assert.h>被包含时定义了宏NDEBUG,那么宏assert被忽略
【入参】
int exp:一个int类型的入参,若为0则表示程序段出错了
【返回值】
void类型的空返回,也就是没有返回值
【test_code】
我们可以发现,当exp入参不为0时,此时程序可以正常往下走,并未退出哦
再看下面一段代码:
当运行此段代码后,会弹窗出来错误,点击“中止”就行,然后我们可以看到打印出来对应的.c位置和assert所在的代码行数
来,我们再来看一段代码,如下:
我们发现,好像assert失去了作用哦,这就是:如果<assert.h>被包含时定义了宏NDEBUG,那么宏assert被忽略
这个是要在assert.h之前定义哦,才会使assert无效
【总结】
好滴,我们现在知道了assert就是一个调试诊断的宏函数,特点如下:
1.assert 只有在 Debug 版本中才有效,如果编译为 Release 版本则被忽略。
2.频繁的调用会极大的影响程序的性能,增加额外的开销,所以建议尽量少使用
3.每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败
4.assert是一个宏,而非函数
5.在调试结束后,可以通过在包含 #include 的语句之前插入 #define NDEBUG 来禁用 assert 调用