#define f (g, g2) g ## g2 - PullRequest
       14

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

5 голосов
/ 28 ноября 2009
#define f(g,g2) g##g2
main()
{
int var12=100;
printf("%d",f(var,12));
}

Вышеупомянутая программа печатает 100 в c, объединяя var и 12. Как работает g ## g2 ??

Ответы [ 5 ]

8 голосов
/ 28 ноября 2009

## просто вставляет токены вместе. Это директива препроцессора.

Е.Г.

#define PASTE(a,b)  a##b

int i=PASTE(1,2);  /* int i=12; */
0 голосов
/ 28 ноября 2009

Конкатенация выполняется препроцессором, потому что вы использовали команду ##.

Если вы не уверены, что делает препроцессор, вы можете попросить gcc остановить его после запуска препроцессора. Поскольку это происходит до запуска компилятора, вывод довольно прост для понимания.

Например, предположим, что у вас есть файл pre.c

#define FOO 123
#define CONCAT(x,y) x##y
#define STRING(x) #x

void main()
{
    int a = FOO;
    int b = CONCAT(123,4567);
    char* c = STRING(IGetQuoted);
}

Вы можете получить вывод препроцессора, передав опцию -E в gcc.

$ gcc -E pre.c 
# 1 "pre.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "pre.c"




void main()
{
    int a = 123;
    int b = 1234567;
    char* c = "IGetQuoted";
}

Имейте в виду, что #include извлечет содержимое указанного файла и может сделать вывод препроцессора довольно длинным.

0 голосов
/ 28 ноября 2009

Это вставка токена, описанная здесь для gcc. Вставка токена выполняется препроцессором, а не компилятором.

0 голосов
/ 28 ноября 2009

Так что после препроцессора это будет выглядеть так:

main()
{
int var12=100;
printf("%d",var12);
}
0 голосов
/ 28 ноября 2009

## - это команда препроцессора для объединения того, что происходит до и после.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...