1、有时我们会用到类似于头文件保护的技术,就是说有些代码在实际开发程序时,用来调试的,但是在程序发布时,就会先屏蔽掉这些代码,也就是说,有选择地执行调试代码。
2、使用这种技术,用到两种预处理功能:assert和NDEBUG。前者是一种预处理宏,assert(expr),若expr为真,则assert什么都不做,若为假,则assert输出信息并终止程序的执行。其定义在cassert头文件中。预处理变量的名字在程序内必须唯一,由预处理器管理。assert宏常用于“不能发生”的条件。而assert的行为依赖于后者,即若定义了NDEBUG则assert什么也不做,默认情况下,没有定义NDEBUG,也就是说定义一个预处理变量NDEBUG,就能关闭调试状态。这时就能避免运行时检查的开销。
3、assert只用于那些确实不可能发生的事情,只能作为调试程序的一种辅助手段,而不能用它替代运行时真正的逻辑检查,和程序自身的包含的错误检查。
4、也可以使用NDEBUG编写自己的条件调试代码。
5、编译器定义了__func__用来存放函数的名字,预处理器也定义了存放当前行号的整型字面值__LINE__、存放文件名的字符串字面值__FILE__、存放文件编译时间的字符串字面值__TIME__、存放文件编译日期的字符串字面值__DATE__