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

12
задан Brian Tompsett - 汤莱恩 20 February 2016 в 22:17
поделиться

4 ответа

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

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

28
ответ дан 2 December 2019 в 03:38
поделиться

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

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

6
ответ дан 2 December 2019 в 03:38
поделиться

## - это Token Pasting Operator

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

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

5
ответ дан 2 December 2019 в 03:38
поделиться

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

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

2
ответ дан 2 December 2019 в 03:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: