2012-10-20 159 views
4

我正在編寫帶有代碼塊的C++程序,並且爲了調試目的,我需要知道代碼塊的構建目標是否設置爲「DEBUG」或「RELEASE」。代碼塊調試預處理器

我已經嘗試過這樣的:

#ifdef DEBUG 
    printf("Debug-Message"); 
#endif 

#ifdef _DEBUG 
    printf("Debug-Message"); 
#endif 

但這一切的話來定義。 我是否必須自己定義DEBUG並更改它,每當我更改構建目標時,還是存在一個我不知道的詞?

+0

不要忘記用'\ n'結束你的調試格式字符串。 –

回答

3

我是否必須自己定義DEBUG並更改它,每當我更改建築目標 或者有一個詞我不知道?

我不知道Code :: Blocks默認設置了什麼。但是,如果你定義自己的#define

Project->Build options...->[Debug|Release]->#defines 

你沒有改變他們爲你構建目標(DEBUG或RELEASE)之間切換。它允許您定義特定於Debug版本的值以及特定於Release版本的值。

爲了避免每次爲每個新項目手動輸入,您可以使用調試/發佈#define創建一個小項目,並將其另存爲項目模板,然後從該項目模板創建新項目。

+0

CodeBlocks應該自它的調試/釋放感知以後真的應該定義這些字符串。在調試配置下,它應該將'assert'的行爲從'abort'改爲'trap'。在調試器中「放棄」程序絕對沒有意義。我很驚訝有多少人因爲委員會的愚蠢決定而沒有使用「assert」。 – jww

3

的常用方法,如通過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 <<具體定義爲我種的優勢。