Что означает ## для препроцессора C (C ++)? - PullRequest
12 голосов
/ 08 января 2010

У меня есть программа 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 ]

27 голосов
/ 08 января 2010

ничего особенного: ## говорит препроцессору объединить левую и правую стороны

см. http://en.wikipedia.org/wiki/C_preprocessor#Token_concatenation

5 голосов
/ 08 января 2010

потому что ## является оператором конкатенации токенов для препроцессора c.

Или, может быть, я не понимаю вопроса.

4 голосов
/ 08 января 2010

## is Оператор вставки токена

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

Если формальному параметру в определении макроса предшествует или следует оператор вставки токена, формальный параметр немедленно заменяется нерасширенным фактическим аргументом. Расширение макроса не выполняется для аргумента до замены.

2 голосов
/ 08 января 2010

#define f(g,g2) g##g2

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

...