эта замена макроса несколько раз должна выдавать ошибку? - PullRequest
2 голосов
/ 02 июня 2011
Выход
#define a b
#define b c
#define c d
main()
{
    int a=192;
    printf("%d\n",a);
    printf("%d\n",b);
    printf("%d\n",c);
    printf("%d\n",d);
}

равен 192 для всех.Как объявлены a, b, c?

Ответы [ 4 ]

3 голосов
/ 02 июня 2011

когда вы используете макрос, вы говорите препроцессору заменить идентификатор (в вашем случае a, b, c) на выражение, следующее за макросом.

Таким образом, эта последовательность определяет, сообщаетпрепроцессор для замены содержимого a на b, замены содержимого b на c и замены содержимого c на d.

, поэтому вы получите то же значение, которое печатается для времен

main()
{
    int d = 192;
    printf("%d\n", d);
    printf("%d\n", d);
    printf("%d\n", d);
    printf("%d\n", d);
}
2 голосов
/ 02 июня 2011

В ваших определениях вы говорите компилятору заменить a-> b, b-> c, c-> d, в конце концов вы заменяете все на d

Итак, ваш код результата (после препроцессора):

main()
{
    int d=192;
    printf("%d\n",d);
    printf("%d\n",d);
    printf("%d\n",d);
    printf("%d\n",d);
}
2 голосов
/ 02 июня 2011

Полученный код

main()
{
    int d=192;
    printf("%d\n",d);
    printf("%d\n",d);
    printf("%d\n",d);
    printf("%d\n",d);
}

, что, конечно, будет печатать одно и то же значение четыре раза.

1 голос
/ 02 июня 2011

Вы смотрели на вывод препроцессора?

Подсказка: как вы думаете, как выглядит строка

int a=192;

после этапа предварительной обработки?

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