通常的方法,如assert(3)手册页和习惯(<assert.h>
在 C 或<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 <<