的常用方法,如通過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'結束你的調試格式字符串。 –