2016-05-02 27 views
1

例如,我定義爲三次AA,是否合法?:顯然是不建議的#define很多次都沒有#民主基金,是這合法嗎?

#include<stdio.h> 
#define AA 10 
#define AA 20 
#define AA 30 
int main() { 
    printf("AA"); 
} 
+4

在您的編譯命令中添加'-Wall'並查看它會告訴您什麼。 – LPs

+3

這不是非法的,但像這樣使用是一個壞主意。編譯時不要忽略警告。 –

+1

法律:是的 - 有用或甚至是一個好主意:不可以。但是C允許你使用許多既沒有用也不好的構思。習慣它;) – tofro

回答

5

甚至認爲它可以編譯。 在你的例子中,你可以只使用#define AA 30一次。在其他情況下,如果要定義一個宏時沒有定義它,你可以使用條件:

#ifndef AA 
#define AA 30 
#endif 

另外,我覺得你的意思是printf("%d\n", AA);打印宏,因爲printf("AA");將只打印字符串字面AA

+0

@LPs這是有爭議的,編譯警告重新定義,但擴展爲30 – fluter

+1

是的。完全是我寫的。 OP代碼給出30,你給出了不同的東西。 – LPs

+0

我不明白嗎?你什麼意思? – fluter

3

讓我們首先糾正你的printf有用的東西開始:與gcc編譯它會產生兩個警告,「AA」被重新定義printf("%d", AA);

。警告非常重要,應該在C中避免,但結果將如預期的那樣(30)。

6

不,它不是。 C標準明確指出,它是一個約束違反,6.10.3 P.2:

目前定義爲類對象宏的標識符不得 由另一個 #define預處理指令重新定義,除非第二定義是一個類似於對象的宏定義,並且兩個替換列表是 相同。

因此,對於所有約束違規,您的編譯器只能發出一個「診斷」,這是一個解釋性消息。它可能會或可能不會繼續編譯您的代碼。

要更直接地說明它,您的代碼有誤,您的編譯器必須告訴您。

9

這在C和C++中都不合法。選自C草案標準N1570

行情:

6.10.3宏替換

約束

1名Tw的ö替換列表是相同的,當且僅當在兩個預處理標記具有 的相同的數字,排序,拼寫和空格分隔,其中所有空格 分隔被認爲是相同的。目前德網絡定義爲一個類對象宏

2所述的identi音響ER應不被另一 #define預處理指令定義忠告網絡連接,除非該第二解音響nition是類似對象的宏 德音響nition和兩個替換列表是相同的。同樣,除非第二種定義是類似於函數的宏定義 ,它具有相同數量和參數的拼寫,並且兩個替換列表中的一個定義爲類似函數的宏的標識符不會被其他#define 預處理指令重新定義是 相同。

選自C草案行情++標準N4582

16.3宏替換[cpp.replace]

1兩個替換列表是相同的,當且僅當在兩個預處理標記具有相同數量的, 排序,拼寫和空格分隔,其中所有空格分隔均視爲相同。目前德網絡定義爲一個類對象宏

2所述的identi音響ER可以是由另一#define預處理 指令規定,第二代網絡nition是類似對象的宏德音響nition和兩個替換列表 是相同的定義雷德音響,否則程序病-formed。同樣,目前定義爲函數樣式的標識符可能會被另一個#define預處理指令重新定義,前提條件是第二個定義是 功能類似的宏定義,它具有相同的參數數量和拼寫,並且兩個替換列表 列表是相同的,否則該程序是不合格的。

相關問題