Russian Belarusian English German Japanese Ukrainian

Rashka.studio - игры и приложения для Android! Заходи, ждём тебя =)

Token-pasting (##) препроцессора

CuBook05

Двойные решетки или 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);
}
Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий


Защитный код Обновить