分享方式:


語彙基元帶入運算子 (##)

雙數字符號或標記貼上運算子 (##),有時稱為合併合併運算符,用於類似物件和函式的宏。 它允許將個別的令牌聯結至單一令牌,因此,不能是巨集定義中的第一個或最後一個令牌。

如果巨集定義中的開頭是型式參數,後方接著語彙基元帶入的運算子,則會立即以未展開的實際引數取代型式參數。 巨集展開會在引數取代之後才執行。

然後,會移除 Token-string每次出現的標記貼上運算符,且前面和之後的標記會串連。 產生的語彙基元必須是有效的語彙基元。 如果是的話,則會掃描語彙基元中是否存在代表巨集名稱的取代項目。 識別項會表示名稱,因此可在取代之前知悉程式中串連的語彙基元。 每一個語彙基元表示在其他位置定義 (可能是在程式或編譯器命令列中) 的語彙基元。 在運算子前方或後方的空白字元為選擇項。

這個範例示範如何在指定程式輸出時使用字串化和語彙基元帶入的運算子:

#define paster( n ) printf_s( "token" #n " = %d", token##n )
int token9 = 9;

如果使用如下的數值引數呼叫巨集

paster( 9 );

巨集會產生

printf_s( "token" "9" " = %d", token9 );

會變成

printf_s( "token9 = %d", token9 );

範例

// preprocessor_token_pasting.cpp
#include <stdio.h>
#define paster( n ) printf_s( "token" #n " = %d", token##n )
int token9 = 9;

int main()
{
   paster(9);
}
token9 = 9

另請參閱

預處理器運算元