2015-09-07 81 views
0

定義兩次如果我定義兩次宏如下宏在代碼

#define a 2 
#define a 3 

了我認爲的「a」的代碼是由圖2,#定義遇到3代替時發生任何不更多的a可用代碼替換爲3。但是當我執行它時,'a'被替換爲3,任何人都可以解釋這裏發生了什麼。

+0

這不是一個警告嗎?你能解釋爲什麼你不想精確地定義這種情況。 –

+0

是它的警告。我很想知道這將如何工作。 – Ann562

回答

5

我不清楚你期待看到什麼。

第二行覆蓋第一行的a的定義。

之後遇到的任何a將被替換爲3

+0

我的疑問是「#define a 2」將在「#define a 3」行以及其他部分代碼中將「a」替換爲2。因此,第二個宏定義將變爲「#define 2 3」 。現在「2」被替換爲3.它是如何工作的 – Ann562

+0

不,在定義 –

3

a將不會被替換爲#define a 3中的2,因爲這也是預處理器。

處理#define a 2後,a值是2,但它是由下面的語句覆蓋#define a 3

+0

中定義了'#define-d宏的名稱*從未*擴展是的,你是對的,但恕我直言,你需要擴展你的回答更適合這個特定的問題。 –

6

如果你定義一個宏兩次這樣,編譯器至少應該給你警告,如果不是錯誤。這是一個錯誤。

§ 6.10.3/2:當前定義爲一個類對象宏的標識符不應由另一#define預處理指令重新定義,除非第二定義是類似對象的宏定義和兩個替換列表是相同的。

您可以通過顯式刪除以前的定義重新定義一個宏:

#define a 2 
/* In this part of the code, a will be replaced with 2 */ 
... 

#undef a 
#define a 3 
/* From here on, a will be replaced with 3 */ 
... 

宏替換髮生,因爲該文件被讀取,使用活動的宏定義在文件中的這個位置,除了內(大部分)預處理指令。

§ 6.10/7:除非另有說明,否則預處理指令中的預處理標記不受宏展開影響。

§ 6.10.3.5/1:直到遇到相應的#undef指令或直到預處理轉換單元結束時(如果沒有遇到任何指令),宏定義纔會持續(與塊結構無關)。