2009年5月18日 星期一

Token-pasting operator(##) in C

我們都知道C語言define前端處理假指令用來定義變數、字串或幾行的原始碼(統稱為巨集, Macro)。
當某一巨集被定義為參數帶入之巨集, 我們最常用的就是把該參數當作變數或指標來使用,如下所示:
#define INC_IDX(val, size) (++val % size) -> 以參數為變數之值帶入此巨集
#define GET_DATA(ptr) (ptr->data) -> 以參數為指標帶入此巨集

然而,我們可以把巨集所帶入的參數當作為識別子(Token)的一部分,如下所示:
 #include <stdio.h>  
   
 int class_num = 9;  
 int class_stds = 10;  
   
 #define GET_MEMBER(postfix) class_ ## postfix  
   
 int main(void)  
 {  
    printf("class_num: %d\n", GET_MEMBER(num));  
    printf("class_stds: %d\n", GET_MEMBER(stds));  
    return 0;  
 }  
如上列所示,class_num可以經由GET_MEMBER巨集(帶入部份識別子, 也就是num)取得,此參數傳遞方法稱為Token-pasting operator,這是一個非常好用的方法, 提供給大家參考。

2 則留言:

就這楊 提到...

請問,你知道##放在變數前與放在變數後的差別是什麼嗎?

Adrian Huang (黃圳柏) 提到...

Hi,
您是指postfix嗎? 如果是的話, "##"必須放在postfix前面