的常用方法,如通过assert(3)手册页和习惯(在C <assert.h>
或<cassert>
在C++)的建议,是在命令行来定义NDEBUG
(例如与gcc -Wall -DNDEBUG
编译)用于非调试编译。在您的Makefile
中,您可以在发布模式下使用CPPFLAGS += -DNDEBUG
(并在调试模式下使用g++ -Wall -g
进行编译)。
我自己的习惯,可能是有一个共同的头文件类似
#ifndef NDEBUG
#define dbgprintf(Fmt,...) do{fprintf(stderr,"%s:%d:" Fmt "\n", \
__FILE__, __LINE__, \
##__VA_ARGS__);}while(0)
#else
#define dbgprintf(Fmt,...) do{}while(0)
#endif
,并在代码中的其他地方使用dbgprintf("i=%d", i)
。 请注意,我在Fmt
宏参数上使用了常量字符串连接,我在其上附加了一个常量换行符,并且我的调试输出包含源文件名和行号(如果需要,也可以使用__func__
)。在纯C++代码,我可能反而有
#ifndef NDEBUG
#define DBGOUT(Out) do{std::out << __FILE__ << ":" << __LINE__ \
<< " " << Out << std::endl;}while(0)
#else
#define DBGOUT(Out) do{}while(0)
#endif
,并使用DBGOUT("i=" << i)
使用的operator <<
具体定义为我种的优势。
不要忘记用'\ n'结束你的调试格式字符串。 –