2017年4月25日 星期二

C語言巨集篇 -- C preprocessor (節錄Gcc Macro Manual)

https://gcc.gnu.org/onlinedocs/cpp/Macros.html



本篇將快速介紹C語言巨集的用法,以及一些實用的技巧


巨集(Macro)最基本的用法,就是拿來定義常數,或是拿來定義一段程式碼區塊,其中 '\' 符號在巨集中表示換行,下面是一個例子
#define BUFFER_SIZE 1024
#define NUMBERS 1, \
                2, \
                3
foo = (char *) malloc (BUFFER_SIZE);
int x[] = { NUMBERS };
你可以用以下指令來察看前處理器將巨集語法編譯後的結果,你會發現所謂的巨集就是拿來做語法上的字串替換
gcc -E -P XXX.c 
像上面這一段程式碼經過前處理器編譯後變成
foo = (char *) malloc (1024);
int x[] = { 1, 2, 3 };
以下將用註解呈現編譯後的結果

C語言前處理器的編譯是循序的,因此巨集必須先定義才會生效,以下是個例子
foo = X;
#define X 4
bar = X;

//前處理器編譯後變成
//foo = X;
//bar = 4;
實際上巨集定義是能包含其他巨集名稱的,例如
#define TABLESIZE BUFSIZE
#define BUFSIZE 1024
//此時TABLESIZE變成1024
另一個有趣的例子,先定義BUFSIZE後,再重新定義BUFSIZE,結果很有趣
#define BUFSIZE 1020
#define TABLESIZE BUFSIZE
#undef BUFSIZE
#define BUFSIZE 37


//此時TABLESIZE為37,
//不管何時使用TABLESIZE,TABLESIZE都會是37不會是1020

沒有留言:

張貼留言