2009-12-14 119 views
3

gcc 4.4.1#define聲明解釋

我維護某人的代碼,我遇到了一些我不明白的東西。

#define RES_API(name, func) name##_##func 

任何人都可以解釋嗎?

非常感謝,

回答

4

##運算符連接兩個令牌。在你的情況下,name附加了下劃線,並附有func

所以RES_API(aName, aFunc)結果在aName_aFunc

本身,它似乎相當煩人。混合使用C和C++代碼時,我可以看到一個用法,因爲C庫傾向於將它們的函數作爲前綴,而C++庫將它們放在一個名稱空間中。

鑑於替代定義,如:

#define RES_API(name, func) name##::##func 

您突然有一種通用的方法來一個C接口,或C++之間切換。

+0

你真的需要C++代碼中的令牌粘貼操作符嗎?我希望編譯器能夠反對'::'不是一個有效的標識符。 –

6

##是連接運算符。在您的代碼中使用RES_API(name1, func1)將替換爲name1_func1。更多信息here

1

而不是做OBJ_DoSomething,用這個宏你可以做RES_API(OBJ, DoSomething)。我個人認爲它很愚蠢。

+2

大量的預處理器的東西是'傻',直到你突然發現你離不開它的原因:) – KevinDTimm

4

我知道你已經得到了你的答案,但是在C-FAQ上有一些很好的信息,它解釋了C Preprocessor magic的配置。

+0

謝謝,這是一個很好的鏈接。在那裏還有其他一些東西,我需要其他一些東西,比如做可變參數函數。大。 – ant2009