Что означает ## для препроцессора C(C++)?
у меня есть 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
?
4 ответов
ничего особенного: ##
говорит препроцессору объединить левую и правую стороны
см.http://en.wikipedia.org/wiki/C_preprocessor#Token_concatenation
потому что ## является оператором конкатенации токенов для препроцессора C.
или, может быть, я не понимаю вопроса.
##
is Оператор Вставки Токенов
оператор двойного знака или "вставки токенов "( # # ), который иногда называют оператором" слияния", используется как в объектных, так и в функциональных макросах. Он позволяет соединять отдельные токены в один токен и поэтому не может быть первым или последним токеном в определении макроса.
если формальному параметру в определении макроса предшествует или следует вставка маркера оператор, формальный параметр немедленно заменяется нерасширенным фактическим аргументом. Расширение макросов не выполняется для аргумента до замены.
#define f(g,g2) g##g2
## используется для объединения двух макросов в C-препроцессоре. Поэтому перед компиляцией f (var,12) следует заменить препроцессором на var12 и, следовательно, вы получили результат.