assert是宏,而不是函数。在C的assert.h文件中
#include
void assert( int expression );
assert的作用是先计算表达式expression, 如果其值为假(即为0),那么它会打印出来assert的内容和__FILE__, __LINE__, __ASSERT_FUNCTION,然后执行abort()函数使kernel杀掉自己并coredump(是否生成coredump文件,取决于系统 配置);否则,assert()无任何作用。
使用assert()的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。所以release版本的不应该执行assert函数或者应该删除调这些语句,
删除很显然不显示, 那么怎么办呢?
因为宏NDEBUG有定义时,宏assert()的定义为空, 基于此在NDEBUG上找突破口
#ifdef NDEBUG
#define assert(x) ((void)0)
#else
办法
缺点:还是要动代码,在include的地方额外加一行
#include
#define NDEBUG
#include
缺点: 在大型项目上,需要环境人员增加此宏定义 , 开发人员还得确认出盘后的环境是否真的有此宏定义了。
-DNDEBUG
注意:
每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败。