2012-06-19 49 views
1

我有一個C++實現文件(my.cpp)間接包括頭部文件(BH),其限定_MAX_DRIVE:C++宏重定義的範圍是什麼?

// b.h 
#define _MAX_DRIVE 64 

然後my.cpp包括stdlib.h中,其也限定_MAX_DRIVE

// stdlib.h 
#define _MAX_DRIVE 3 /* max. length of drive component */ 

顯然,這會產生宏觀的重新定義警告:

stdlib.h(185) : warning C4005: '_MAX_DRIVE' : macro redefinition 

我的問題是:

  1. 這個重定義會影響多少代碼,它只是my.cpp的編譯單元?
  2. 如果my.cpp是靜態庫的一部分,重新​​定義的值是否會進入其他代碼?
  3. 如果我甚至從未在my.cpp中引用_MAX_DRIVE,是否可以安全地告訴編譯器忽略此宏重新定義警告?
+3

編譯器保留以下劃線開頭並帶有大寫字母(例如'_MAX_DRIVE')的標識符。不要在你自己的頭文件中使用它們! –

+0

感謝@Adam,很高興知道。我正在處理那些不會改變的遺留代碼,所以我只需要處理它。 – Matthew

回答

6
  1. 這是直到當前編譯單元結束,或直到下一個#undef
  2. 否;宏名稱只能由預處理器看到,預編譯器在編譯甚至開始之前就會結束運行。
  3. 這聽起來不像是一個非常明智的想法。避免使用兩個具有相同名稱的宏(尤其是一個以單個下劃線開頭,後跟一個大寫字母的宏,因爲它們被保留用於實現)會是一​​個更好的主意。
3

這個重定義會影響多少代碼,它只是my.cpp的編譯單元?

它影響的是包括BH和stdlib.h中所有文件,如果它永遠不會#undef -ed

能否重新定義的價值做它的方式到其他代碼,如果my.cpp是一個靜態的一部分圖書館?

不,預處理符號只能在編譯時生效。編譯模塊與它無關。

如果我從未在my.cpp中引用_MAX_DRIVE,是否可以安全地告訴編譯器忽略此宏重定義警告?

是的,直到有一天你或你的任何代碼的用戶使用它,忘記或不知道這種危險。