2010-12-18 23:29
1398人閱讀收藏
舉報 編譯器gcc語言c
關於巨集的作用域
1. 巨集沒有可見域。
如果說有,那就是從本檔案(包括被包含的檔案)中,該巨集定義處開始,至檔案的尾部或取消巨集(#undef)為止。
2. 考慮一種特殊情況:
乙個巨集定義,如果寫在結構體之內,即使與結構體之外的巨集定義名字重複了最多是編譯警告。可是如果不在結構體之內,名字重複可肯定是error。(未證實,可以做實驗,而且可以把兩處的巨集定義成不同的值,會是什麼情況?)
定義在結構體之內的巨集在結構體內可以隱藏定義在結構體之外定義的巨集,如果都在結構體之外定義,那麼就是定義了兩個相同的巨集,而乙個在內,乙個在外,則結構體內只看到內部定義的巨集,而結構體外只看到外部定義的巨集,跟變數的隱藏類似。
巨集的處理是在編譯的預處理階段完成的。預處理器根本就不認識什麼結構體,在c語言編譯器編譯這個c檔案中的結構體時,這個define語句已經不存在了。相應的,用到這個巨集的地方,巨集本身也已經替換成巨集的值(這個巨集展開)。大家可以用gcc -e命令來只做預處理而不編譯,看看出來後的檔案。
至於為什麼在結構體裡頭#deifne,是因為這個巨集一般用於定義該結構體裡頭的標誌位變數的可能的值,和結構體的這個變數密切相關。放在一起從邏輯上比較容易理解。
define巨集定義
預處理指令 以 開頭的行,都預處理指令,用於指示編譯器做一些預處理工作。比如 include h 注 預處理指令不是語句,行尾不要加分號 define的兩種用法 1.定義乙個 數值 2.定義乙個 算式 注 工程中應該避免使用這兩種方式 定義乙個值 define pi 3.14 int main 定義...
巨集定義 define
巨集定義又稱為巨集代換 巨集替換,簡稱 巨集 格式 define 識別符號 字串 其中的識別符號就是所謂的符號常量,也稱為 巨集名 預處理 預編譯 工作也叫做巨集展開 將巨集名替換為字串。1 define printx printf d n x 在c程式中,以 字元開頭的 都是一條c預處理器語句。預...
define巨集定義
include include define sub x,y x y define access before element,offset,value sub element,offset value using namespace std int main access before array...