gcc 4.4.1#define聲明解釋
我維護某人的代碼,我遇到了一些我不明白的東西。
#define RES_API(name, func) name##_##func
任何人都可以解釋嗎?
非常感謝,
gcc 4.4.1#define聲明解釋
我維護某人的代碼,我遇到了一些我不明白的東西。
#define RES_API(name, func) name##_##func
任何人都可以解釋嗎?
非常感謝,
##
運算符連接兩個令牌。在你的情況下,name
附加了下劃線,並附有func
。
所以RES_API(aName, aFunc)
結果在aName_aFunc
。
本身,它似乎相當煩人。混合使用C和C++代碼時,我可以看到一個用法,因爲C庫傾向於將它們的函數作爲前綴,而C++庫將它們放在一個名稱空間中。
鑑於替代定義,如:
#define RES_API(name, func) name##::##func
您突然有一種通用的方法來一個C接口,或C++之間切換。
的##
是連接運算符。在您的代碼中使用RES_API(name1, func1)
將替換爲name1_func1
。更多信息here。
而不是做OBJ_DoSomething
,用這個宏你可以做RES_API(OBJ, DoSomething)
。我個人認爲它很愚蠢。
大量的預處理器的東西是'傻',直到你突然發現你離不開它的原因:) – KevinDTimm
我知道你已經得到了你的答案,但是在C-FAQ上有一些很好的信息,它解釋了C Preprocessor magic的配置。
謝謝,這是一個很好的鏈接。在那裏還有其他一些東西,我需要其他一些東西,比如做可變參數函數。大。 – ant2009
你真的需要C++代碼中的令牌粘貼操作符嗎?我希望編譯器能夠反對'::'不是一個有效的標識符。 –