2011-02-24 21 views
2

在我的班級工作中,我已經成功完成了這一任務,但僅限於非常簡單的程序。今天,我有一個更復雜的程序,並且在將DEBUG定義爲符號之後,Eclipse做了可怕的雜事,而在我刪除定義之後,這些可怕的事情並沒有消失。另一個消息來源告訴我,gcc編譯器使用了DEBUG符號,並且我自己定義了一個標準庫來干擾它。我可以在C中成功使用DEBUG作爲常量符號嗎?

可以自己使用#define DEBUG嗎?或不?

回答

5

是的,您自己定義符號DEBUG完全可以。但它是而不是 ok定義符號_DEBUG(注意前導下劃線):以下劃線和大寫字母或兩個下劃線開頭的符號保留供實現(即編譯器和工具鏈)使用。既然它們是保留的,你不應該自己定義它們,但你當然可以測試它們的存在。參見C99標準的第7.1.3節。

另一個符號要注意的是NDEBUG,您可以自由定義或不定義,但如果你列入<assert.h>之前定義它,它會導致刪除所有assert語句。

+0

您能指點我某種搜索或關鍵字,我可以用它來找到這個實現特定的東西嗎?我一直在試圖找出Eclipse使用哪些符號的一段時間,但我的Google-fu似乎找不到合適的單詞。 – 2011-02-24 05:39:03

0

這可能是可能的,但你停止試圖找出,這當然是不好的做法。

+0

嗯,好吧。爲什麼? – 2011-02-24 05:28:03

+0

如果它破壞了你的代碼,那很明顯,爲什麼。如果您在問標準庫或編譯器中使用了DEBUG,那是一個不同的問題。 – jmilloy 2011-02-24 05:30:36

+0

由於「DEBUG」這個詞很常見,所以它幾乎可以保證在命名空間的某個點與另一個頭/ api相沖突。 – jmq 2011-02-24 05:31:13

0

這就是爲什麼「較新」的語言有namespaces。不要使用它。在我們的代碼中,我們會使用_DEBUG代替(或者您可以使用_DEBUG___DEBUG__,有些人不喜歡在前面使用單個下劃線)。

編輯:我誤解了有關使用_DEBUG(我們不使用)。我們使用__DEBUG__(正面和背面有兩個下劃線)。

+2

您可能不應該用雙下劃線開始名稱。 – 2011-02-24 05:30:18

+0

我只是在我們的代碼中查找它,我們在前面和後面使用雙下劃線(而不是前面的單個)。 – jmq 2011-02-24 05:34:06

+0

以下劃線和大寫字母或兩個下劃線開頭的名稱保留供實施使用;如果一個程序定義了一個保留的標識符,那麼這個行爲是未定義的(C99§7.1.3)。 – 2011-02-24 05:35:07

1

DEBUG有點泛泛用於這種事情,只是因爲地球上數以百萬計的無數代碼猴子也會有相同的想法。

你最好使用不太可能發生衝突的東西,如PAX_DEBUGYOURCOMPANYNAME_BTREEMODULE_DEBUG或類似的東西。

2

如果刪除符號不能解決您的問題,那麼該符號不會導致您的問題。

我從來沒有聽說過DEBUG作爲符號,但_DEBUGused by Visual Studio。另外,NDEBUG<assert.h>用於關閉斷言語句。

相關問題