assert 检查一个不能发生的条件
assert(expr) 当表达式里的值为 0 或false时,输出信息并终止程序的执行。
assert(word.size() > threshold); // 如果该条件被判定为false时将终止程序
NDEBUG预处理变量
assert的行为还依赖于NDEBUG的变量。
我们来想一下,如果你的软件已经完成,经过相当的测试,然后需要发布了。
那么这个时候我们将不再需要一些DEBUG的代码,而这样不仅能减少代码的长度,更能提高一些运行的速度。
所以我们一般将DEBUG的工具与NDEBUG进行联系,比如以下的写法
void print(const int ia[], size_t size) { #ifndef NDEBUG // 如果没有定义NDEBUG 宏 // __func__ 是编译器定义的一个局部静态变量,用于存放函数的名字 cerr << __func__ << ": array size is " << size << endl; #endif // NDEBUG }
这样,这个函数在发布版本中定义了NDEBUG后将会变为一个空函数。
下面的代码列出了一些常用的预定义宏,可以帮助我们精准的定位到特定的代码
#include <iostream> void allDef() { std::cout << " __func__ 函数名称的定义: " << __func__ << "\n __FILE__ 文件名称的定义: " << __FILE__ << "\n __LINE__ 当前行号的值: " << __LINE__ << "\n __TIME__ 编译时间的值: " << __TIME__ << "\n __DATE__ 编译日期的值: " << __DATE__ << std::endl; } int main() { allDef(); }