1.调试标记
为了避免在bug找到后,要删除调试代码,我们可以利用预处理器的选择编译功能,在需要调试时,将编译“开关”打开,故障解除后,将编译“开关”关闭。这样编译器在编译文件的时候,不会把不需要的调试代码编译成目标代码,减少了目标文件的大小。这里所说的“开关”就是起到一个调试标记的作用,常用的标识名是:DEBUG(注意,不能使用NDEBUG,这是C中的保留字)
#define DEBUG #ifdef DEBUG //需要调试的代码 #endif
2.把变量和表达式转换成字符串
在调试程序的过程中,往往需要输出一些变量和表达式的值,常规的方法可以这样实现:
cout<<"i="<<i<<endl; cout<<"a+b="<<a+b<<end;
下述方法可能使代码更简洁:
1 #include <iostream> 2 #define PR(E) cout<<#E<<E<<endl 3 using namespace std; 4 int main(void) 5 { 6 PR(i); 7 PR(a+b); 8 return 0; 9 }
3.C语言的assert()宏
assert()是c语言中定义的一个调试宏,在C中的头文件是 <assert.h>,C++中的头文件是<cassert>
当使用assert()时,给它传递一个参数,该参数是一个表示某个断言为真的表达式。预处理器会产生代码去判断这个断言的真假。如果断言为假,则发出一个错误信息告诉断言是什么并且终止程序
//#define NDEBUG #include<cassert> int main() { int i=100; assert(i!=100); }
允许结果:
如果调试结束,可以在assert()宏前面插入#define NDEBUG 结束调试