如果我有一個C文件foo.c,同時我給出-DMACRO=1
作爲編譯的命令行選項。但是,如果在頭文件中我也有-D MACRO和#define MACRO的優先級
#define MACRO 2
哪些會優先?
如果我有一個C文件foo.c,同時我給出-DMACRO=1
作爲編譯的命令行選項。但是,如果在頭文件中我也有-D MACRO和#define MACRO的優先級
#define MACRO 2
哪些會優先?
手冊說:首先-D和-U爲了進行評估,然後將所有 - 包括(第-D)
最好的方法:試試吧。
定義是按照編譯器看到它們的順序存儲的,當編譯器遇到一個具有相同名稱的新宏時,它會用新的宏覆蓋前面的宏(至少在gcc中是這種情況)。當發生這種情況時,GCC也會給你一個警告。
你會得到一個錯誤的宏重新定義。顯然-D
首先被定義(在源文件被解析之前而不是之後)或者它沒有用。 #define
然後是重新定義。
命令行選項應用於從文件讀取的任何行之前。文件內容按寫入的順序應用。一般來說,如果任何宏被重新定義,至少會得到一個警告,不管是否涉及命令行。如果重新定義並不重要,警告可能會消失,也許是因爲兩個定義都是相同的。
來回答這樣一個問題,正確的方法是建立一個小的測試案例和嘗試。例如,在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行的任何內容之前被處理。
我做的你在做什麼的假設,但如果你想在命令行可以爲宏提供一個非缺省值,嘗試一下本作的宏定義:
#ifndef MACRO
#define MACRO 2
#endif
這樣,如果MACRO已被定義(通過命令行參數),它既不會被重新定義也不會導致錯誤。
當你嘗試時發生了什麼? – 2010-10-19 06:55:27