2013-09-05 65 views
1
#include <stdio.h> 
#define PRINT(name) print ## name() 

void printHE() 
{ 
    printf("Hello"); 
} 
void printWO() 
{ 
    printf("World\n"); 
} 


enum { 
    HE, 
    WO, 
}; 

int main() 
{ 
    PRINT(HE); 
    PRINT(WO); 
} 

它完美地工作,但爲什麼?這個技巧是什麼?

###define是什麼意思?

爲什麼HE沒有轉換爲0

+2

? – trojanfoe

+4

你不向我們展示'#define',所以我們只能猜測你在做什麼。在預處理器中,##表示串聯。 –

+1

** #define中的##是什麼意思?** .. **是哪裏** –

回答

4

既然你問##我假設PRINT定義爲

#define PRINT(X) print##X() 

##是一個標記粘貼的運營商來說,兩個記號,​​以它的左側和其右側連接在一起,產生一個令牌。

當您編寫PRINT(HE)時,預處理器將其轉換爲printHE(),這是一個常規函數調用。

,因爲他是一個枚舉,他應該翻譯成0

這是一個非常好的問題!翻譯不會發生,因爲預處理器在解釋enum之前運行,因此HEWOenum成員不會更改任何內容。

+0

我對此感到困惑:因爲'HE'是一個枚舉,應該將'HE'轉換爲'0'嗎? –

+0

@LidongGuo不,如前所述,enum不起作用。預處理器使用術語「print」並將其粘貼到「HE」上以產生「printHE」,這是函數的名稱。 – trojanfoe

+0

@LidongGuo這是一個非常好的問題,請參閱編輯。 – dasblinkenlight

0

這是表達式中的轉義序列。它連接最左邊和最右邊來產生令牌。

##是標記粘貼操作

0

在我的電腦,它不工作的權利。

two_sharp.c :(文字+ 0x3a):未定義的引用PRINT' two_sharp.c:(.text+0x46): undefined reference to PRINT」 collect2:如下圖所示打印錯誤LD回來,在那裏是'PRINT`定義1退出狀態