Учись программированию на C++ Builder бесплатно!

Двойные решетки или 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);
}
Поделиться