2013-05-24 5 views
1
#define f(g,g2) g##g2 
main() 
{ 
int var12=100; 
printf("%d",f(var,12)); 
} 

Этот код дает выход 100, но если препроцессор будет реализован, то printf будет переписать в виде:Препроцессор директива с хэш

printf("%d",var##12); 

Тогда, как пришел выход?

+0

Что вы подразумеваете под реализацией? –

ответ

0

Двойной хеш ## является token pasting operator препроцессора. printf будет переписан так:

printf("%d",var12); // No double-hash 

двойной номер-знак или «маркер-вставки» оператор (##), который иногда называют «слияние» оператора, используется в как объектно-подобные, так и функциональные макросы. Это позволяет отдельным токенам объединяться в один токен и, следовательно, не может быть первым или последним токеном в определении макроса.

+0

Является ли этот оператор «токен-вставка», используемый только в определении макросов или в другом месте в программе? – Ceres111

+0

@ Ceres111 Оператор Token-pasting определяется препроцессором, поэтому он недействителен вне макросов. Вы можете использовать его как с функциональными, так и с «объектно-ориентированными» макросами, то есть нормально писать '#define MYVAR var ## 12', а затем' printf ("% d", MYVAR); ' – dasblinkenlight

0

Поскольку f(var, 12) заменяется var12, что имя переменной, которую вы объявили и назначены в строке выше. Директива препроцессора ## объединяет два аргумента.

 Смежные вопросы

  • Нет связанных вопросов^_^