在我的班級工作中,我已經成功完成了這一任務,但僅限於非常簡單的程序。今天,我有一個更復雜的程序,並且在將DEBUG定義爲符號之後,Eclipse做了可怕的雜事,而在我刪除定義之後,這些可怕的事情並沒有消失。另一個消息來源告訴我,gcc編譯器使用了DEBUG符號,並且我自己定義了一個標準庫來干擾它。我可以在C中成功使用DEBUG作爲常量符號嗎?
可以自己使用#define DEBUG嗎?或不?
在我的班級工作中,我已經成功完成了這一任務,但僅限於非常簡單的程序。今天,我有一個更復雜的程序,並且在將DEBUG定義爲符號之後,Eclipse做了可怕的雜事,而在我刪除定義之後,這些可怕的事情並沒有消失。另一個消息來源告訴我,gcc編譯器使用了DEBUG符號,並且我自己定義了一個標準庫來干擾它。我可以在C中成功使用DEBUG作爲常量符號嗎?
可以自己使用#define DEBUG嗎?或不?
是的,您自己定義符號DEBUG
完全可以。但它是而不是 ok定義符號_DEBUG
(注意前導下劃線):以下劃線和大寫字母或兩個下劃線開頭的符號保留供實現(即編譯器和工具鏈)使用。既然它們是保留的,你不應該自己定義它們,但你當然可以測試它們的存在。參見C99標準的第7.1.3節。
另一個符號要注意的是NDEBUG
,您可以自由定義或不定義,但如果你列入<assert.h>
之前定義它,它會導致刪除所有assert
語句。
這就是爲什麼「較新」的語言有namespaces。不要使用它。在我們的代碼中,我們會使用_DEBUG
代替(或者您可以使用_DEBUG_
或__DEBUG__
,有些人不喜歡在前面使用單個下劃線)。
編輯:我誤解了有關使用_DEBUG(我們不使用)。我們使用__DEBUG__
(正面和背面有兩個下劃線)。
您可能不應該用雙下劃線開始名稱。 – 2011-02-24 05:30:18
我只是在我們的代碼中查找它,我們在前面和後面使用雙下劃線(而不是前面的單個)。 – jmq 2011-02-24 05:34:06
以下劃線和大寫字母或兩個下劃線開頭的名稱保留供實施使用;如果一個程序定義了一個保留的標識符,那麼這個行爲是未定義的(C99§7.1.3)。 – 2011-02-24 05:35:07
DEBUG
有點泛泛用於這種事情,只是因爲地球上數以百萬計的無數代碼猴子也會有相同的想法。
你最好使用不太可能發生衝突的東西,如PAX_DEBUG
或YOURCOMPANYNAME_BTREEMODULE_DEBUG
或類似的東西。
如果刪除符號不能解決您的問題,那麼該符號不會導致您的問題。
我從來沒有聽說過DEBUG
作爲符號,但_DEBUG
是used by Visual Studio。另外,NDEBUG
由<assert.h>
用於關閉斷言語句。
您能指點我某種搜索或關鍵字,我可以用它來找到這個實現特定的東西嗎?我一直在試圖找出Eclipse使用哪些符號的一段時間,但我的Google-fu似乎找不到合適的單詞。 – 2011-02-24 05:39:03