通常的方法,如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 <<