2010-10-19 76 views
8

如果我有一個C文件foo.c,同時我給出-DMACRO=1作爲編譯的命令行選項。但是,如果在頭文件中我也有-D MACRO和#define MACRO的優先級

#define MACRO 2 

哪些會優先?

+8

當你嘗試時發生了什麼? – 2010-10-19 06:55:27

回答

1

手冊說:首先-D和-U爲了進行評估,然後將所有 - 包括(第-D)

最好的方法:試試吧。

4

定義是按照編譯器看到它們的順序存儲的,當編譯器遇到一個具有相同名稱的新宏時,它會用新的宏覆蓋前面的宏(至少在gcc中是這種情況)。當發生這種情況時,GCC也會給你一個警告。

4

你會得到一個錯誤的宏重新定義。顯然-D首先被定義(在源文件被解析之前而不是之後)或者它沒有用。 #define然後是重新定義。

7

命令行選項應用於從文件讀取的任何行之前。文件內容按寫入的順序應用。一般來說,如果任何宏被重新定義,至少會得到一個警告,不管是否涉及命令行。如果重新定義並不重要,警告可能會消失,也許是因爲兩個定義都是相同的。

來回答這樣一個問題,正確的方法是建立一個小的測試案例和嘗試。例如,在q3965956.c把下面:

#define AAA 2 
AAA 

,並通過C預處理器運行它,也許gcc -E

 
C:>gcc -DAAA=42 -E q3965956.c 
# 1 "q3965956.c" 
# 1 "" 
# 1 "" 
# 1 "q3965956.c" 
q3965956.c:1:1: warning: "AAA" redefined 
:1:1: warning: this is the location of the previous definition 

2 

C:> 

您可以從輸出中看到,宏擴展到了價值由文件中的#define給出。此外,您可以從#指令序列中看到內置定義和命令行都在q3965956.c的第1行的任何內容之前被處理。

5

我做的你在做什麼的假設,但如果你想在命令行可以爲宏提供一個非缺省值,嘗試一下本作的宏定義:

#ifndef MACRO 
#define MACRO 2 
#endif 

這樣,如果MACRO已被定義(通過命令行參數),它既不會被重新定義也不會導致錯誤。