2013-08-29 246 views
0

任何人都可以定義什麼是一個STRAY的定義? 。第二個問題: 我在閱讀「在21天內教自己C++」一書,他說我們不應該定義術語DEBUG。我想知道爲什麼?問題的C++預處理器定義

+6

你可能應該讀你的書。 – progrenhard

+1

據我所知,DEBUG沒有任何問題。不過,您希望遠離以下劃線開頭的標識符。它們以各種方式留給實施使用,所以你可以踩一些東西的腳趾。 –

+0

好的。謝謝。我知道了 – ProDev7

回答

7

第一部分:

一個流浪定義是一個預處理定義,改變了一些其他的代碼(或實際代碼),其中最有可能不會是故意的行爲。例如,你可以寫一個頭文件,並使用下面的行:

#define main is_awesome 

這會不會在你的頭文件中的任何直接影響,可能甚至沒有在你的代碼,但別人,包括這個頭文件包含函數int main(int argc, char **argv)的文件將遇到問題,因爲此雜散定義將會將該函數的名稱更改爲int is_awesome(int argc, char **argv),並且應用程序突然不再有main入口點!

以類似的方式,宏DEBUG可能會導致此類問題。通常,DEBUG應該僅由編譯器自己定義,取決於它是否構建調試代碼(基於您的編譯器,您可能必須自己設置它)。如果你自己定義了DEBUG,你可能會觸發調試代碼,即使你實際上正在創建一個發佈版本。

一般來說,這些錯誤或問題可能很難追查到,特別是如果您不知道如何查看預處理代碼(您無法看到基本代碼中的問題/錯誤和最有可能的線路號碼也將被關閉)。


如何避免這種情況?三個簡單的規則,這將使你的生活和其他人輕鬆了很多的:

  • 只能使用預處理器定義時,你真的要(例如控制代碼包含在編譯時)。
  • 始終清理(#undef)您不需要在頭文件之外的預處理器定義。
  • 如果您必須使用某種全局預處理器定義,請使其名稱唯一,例如通過預先添加庫或項目名稱。例如。而不是定義DEBUG您可以使用MYLIB_DEBUG
+0

好天才。我很欣賞你的有用解釋 – ProDev7