在c/c++中没有像c#/java那样强大的异常机制, 程序出了问题怎么办呢? 作为一个程序员呢,感觉是一小半的时间是在写代码,而一大部分的时间却一头扎在代码的雾水中,不断的debug, 辛苦呀, 今天我总结一下一些简单的调试技巧吧
技巧一:输出调试, 这个不用说了吧,也算不上技巧, 就是将想知道的数据直接输出来, 优点是灵活有针对性,但是太麻烦了
技巧二:调试标记法, 这个方法解决了不断输出中间结果的问题,分两种:
2.1. 预处理器调试标记:就是通过#define 定义一个或者是多个调试标记(在头文件中更合适),然后再需要调试的地方用#ifdef ???检测???的标记, 当调试完毕后就可以用#endif结束调试代码
实例代码如下:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cassert> #include <cstdlib> #include <cassert> #define DEBUG using namespace std; void test() { #ifdef DEBUG cout << "debug is power" << endl; #endif } int main() { test(); return 0; }
2.2运行期间调试标记
然后另一种调试标记的方法是运行期间调试标记, 顾名思义就是在运行期间自己决定是否需要调试, 这种方法更加方便, 可以定义一个bool值来决定是否调试
下面是实例代码:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cassert> #include <cstdlib> #include <cassert> #define DEBUG #define PR(x) cout << "x : " << (x) << endl; using namespace std; bool debug; void test() { int a = 10; if(debug) { cout << " debug is power" << endl; PR(a); } } void Debug() { int dd; cout << "是否启动调试 1/0 :"; cin >> dd; assert(dd == 1 || dd == 0); if(dd) debug = true; else debug = false; } int main() { #ifdef DEBUG //预处理器调试标记 Debug(); //运行期间调试标记 #endif test(); return 0; }
技巧三:把变量和表达式转换成字符串的形式
在c/c++中的 # 是一个非常强大的符号, 如果能够用好, 对自己的代码调试有很大的作用, 下面看代码吧
实例如下:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cassert> #include <cstdlib> #include <cassert> using namespace std; #define PR(x) cout << #x << " : " << (x) << endl; // 和上面的那个PR(x) 看看有什么不同的效果吧 int main() { int a = 123; PR(a); return 0; }
技巧四:利用c语言的assert()宏, 感觉这个在acm中式比较实用的,很是方便
assert()宏需要引用#include <cassert> 或者是#include <assert.h>, 这个宏会自动根据表达式生成调试代码,如果出错就会自动终止程序
实例如下:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cassert> #include <cstdlib> #include <cassert> using namespace std; #define PR(x) cout << #x << " : " << (x) << endl; int mod(const int u, const int v) { assert(v > 0); return u % v; // 不能除零错误, 取模内部实现也是除法 } int main() { int a = 123, b = 0, c = 10; PR(mod(a, b)); PR(mod(a, c)); return 0; }
还有很多我不知道的调试技巧希望可以大家共享呀