Что означает ## для препроцессора 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 и, следовательно, вы получили результат.