Что означает ## для препроцессора 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?


person Vijay    schedule 08.01.2010    source источник
comment
Потому что именно это означает ## в препроцессоре C. Это все равно, что сказать, почему i++ увеличивает i?. Потому что так сказано в стандарте C!   -  person Alok Singhal    schedule 08.01.2010
comment
@Richo .... это не домашняя работа. Поскольку я не очень хорошо знаком с препроцессором, у меня был этот вопрос в голове. Это может быть легко для вас и может выглядеть как домашняя работа. но для тех, кто этого не делает знаете, это не так просто понять.   -  person Vijay    schedule 08.01.2010
comment
Я уверен, что это должно быть дубликатом, но, конечно, поиск Google и SO терпит неудачу, когда дело доходит до поиска ##   -  person John Carter    schedule 08.01.2010


Ответы (4)


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

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

person cobbal    schedule 08.01.2010

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

Или я не понимаю вопроса.

person Stefano Borini    schedule 08.01.2010
comment
Он объединяет токены, а не строки. - person Emerick Rogul; 08.01.2010

## – это оператор вставки токенов.

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

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

person Prasoon Saurav    schedule 08.01.2010

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

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

person SHANAVAS P    schedule 08.01.2010