众所周知,写一段稍微复杂的代码,就会马上面临调试的需要,而最基本的检测程序运行情况的调试技巧,就是在代码中安插许多 “警哨” 来帮助我们监视随时可能发生的异常。
技术上这没啥好说的,只是对于一个代码洁癖晚期患者来说,怎样写得干净又漂亮,是一件比写代码本身更重要的事情。
先来一段反面教材看看:
像上述程序那样的话,将不得已要对很多临时调试性代码做注释,用的时候要去掉注释符,非常麻烦。
更好的写法是怎样的呢?
注意到,我们使用条件编译语句 #ifdef 来包含待调试语句,这样就能非常方便地开启或者关闭调试信息,而且没有注释符嵌套的烦恼。
那么,我们怎么控制这些调试语句的开启和关闭呢? 除了在代码里面定义宏之外,更正统的做法是给编译器相应的参数来控制:
开启调试功能:
gcc example.c -o example -DDEBUG
在这里,-D就是编译的同时,让gcc帮我们自动定义(Define)一个临时宏,这个临时宏的名字就紧跟在这个选项 -D 的后面,比如 DEBUG。带上了这个选项就相当于在代码里面写了这一行代码:
#define DEBUG
关闭调试功能:
gcc example.c -o example
注意到,当我们关闭调试功能的时候,虽然代码还在,但是编译出来的执行程序已经去除了这部分代码,因此可以最大限度节约了程序的尺寸大小,同时我们也再不用在代码中频繁修改来增删注释。这样用起来是不是非常方便呢?