定義兩次如果我定義兩次宏如下宏在代碼
#define a 2
#define a 3
了我認爲的「a」的代碼是由圖2,#定義遇到3代替時發生任何不更多的a可用代碼替換爲3。但是當我執行它時,'a'被替換爲3,任何人都可以解釋這裏發生了什麼。
定義兩次如果我定義兩次宏如下宏在代碼
#define a 2
#define a 3
了我認爲的「a」的代碼是由圖2,#定義遇到3代替時發生任何不更多的a可用代碼替換爲3。但是當我執行它時,'a'被替換爲3,任何人都可以解釋這裏發生了什麼。
我不清楚你期待看到什麼。
第二行覆蓋第一行的a
的定義。
之後遇到的任何a
將被替換爲3
。
我的疑問是「#define a 2」將在「#define a 3」行以及其他部分代碼中將「a」替換爲2。因此,第二個宏定義將變爲「#define 2 3」 。現在「2」被替換爲3.它是如何工作的 – Ann562
不,在定義 –
a
將不會被替換爲#define a 3
中的2,因爲這也是預處理器。
處理#define a 2
後,a
值是2,但它是由下面的語句覆蓋#define a 3
中定義了'#define-d宏的名稱*從未*擴展是的,你是對的,但恕我直言,你需要擴展你的回答更適合這個特定的問題。 –
如果你定義一個宏兩次這樣,編譯器至少應該給你警告,如果不是錯誤。這是一個錯誤。
§ 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
指令或直到預處理轉換單元結束時(如果沒有遇到任何指令),宏定義纔會持續(與塊結構無關)。
這不是一個警告嗎?你能解釋爲什麼你不想精確地定義這種情況。 –
是它的警告。我很想知道這將如何工作。 – Ann562