Двойные решетки или token-pasting оператор (##), иногда оператор называется «слияние», и используется в объектах и функциях макросов. Он разрешает отдельным токенам быть соединенным в один токен и поэтому не может быть первым или последним токеном в определении макроса.
Если формальный параметр в определении макроса следует за token-pasting оператором, то формальный параметр немедленно заменяется на unexpanded фактическим аргументом. Расширение макроса не выполняется в аргументе до замены.
Затем каждое вхождение token-pasting оператора в token-string удаляется и токены сцепляются и выполняются. Результирующий маркер должен быть допустимым токеном. Если это так, то токен просмотрен для возможной замены если он представляет имя макроса. Идентификатор, представляющий имя, под которым будут полностью в программе сцепленные токены перед заменой. Каждый маркер представляет маркер, заданный в другом месте в рамках программы или в командной строке компилятора. Пробел перед или после оператора является необязательным.
Пример ниже иллюстрирует использование операторов stringizing и token-pasting в определении выходных данных программы:
#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);
}