Оператор вставки токена (##)

Оператор двойного числа или вставки маркеров (##), который иногда называется оператором объединения или объединения, используется как в макросах типа объекта, так и в таких функциях. Он позволяет объединять отдельные маркеры в один маркер, поэтому не может быть первым или последним маркером в определении макроса.

Если перед формальным параметром в определении макроса или после него находится оператор вставки токена, этот формальный параметр сразу же заменяется неразвернутым фактическим аргументом. До замены расширение макроса в аргументе не выполняется.

Затем каждое вхождение оператора вставки маркера в строке маркера удаляется, а маркеры, предшествующие и следующие за ним, объединяются. Результирующий токен должен быть допустимым. Если это так, токен сканируется для возможной замены, если он представляет имя макроса. Идентификатор представляет имя, которое будут иметь объединенные токены в программе до замены. Каждый токен представляет токен, определенный в программе или в командной строке компилятора. Пробел перед или после оператора необязателен.

В приведенном ниже примере показано использование оператора создания строки и оператора вставки токена для задания выходных данных программы.

#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

См. также

Операторы препроцессора