У меня есть программа C ниже:
#define f(g,g2) g##g2
main()
{
int var12=100;
printf("%d",f(var,12));
}
когда я выполняю просто препроцессор, он разворачивает это как
{
int var12=100;
printf("%d",var12);
}
который является причиной, почему вывод равняется 100.
Может кто-либо говорить мне, как/почему препроцессор расширяется var##12 to var12
?
ничего особенного: ##
говорит препроцессору соединить левую и правую стороны
см. http://en.wikipedia.org/wiki/C_preprocessor#Token_concatenation
потому что ## - это оператор конкатенирования токенов для препроцессора c.
Или, может быть, я не понимаю вопроса.
##
- это Token Pasting Operator
Оператор двойного знака или "token-pasting" (##), который иногда называют оператором "слияния", используется как в объектно-подобных, так и в функционально-подобных макросах. Он позволяет объединять отдельные лексемы в одну и, следовательно, не может быть первой или последней лексемой в определении макроса.
Если формальному параметру в определении макроса предшествует или за ним следует оператор вставки лексем, то формальный параметр немедленно заменяется на необъясненный фактический аргумент. Макрорасширение не выполняется на аргументе до замены.
#define f(g,g2) g##g2
## используется для объединения двух макросов в c-препроцессоре. Поэтому перед компиляцией f(var,12) должен быть заменен препроцессором на var12 и, следовательно, вы получите результат.