Поделиться через


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

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

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

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

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

#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);
}
  

См. также

Ссылки

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