C #define макросы - PullRequest
       9

C #define макросы

3 голосов
/ 26 января 2009

Вот что у меня есть, и мне интересно, как это работает и что на самом деле делает.

#define NUM 5
#define FTIMES(x)(x*5)

int main(void) {
    int j = 1;
    printf("%d %d\n", FTIMES(j+5), FTIMES((j+5)));
}

Производит два целых числа: 26 и 30.

Как это сделать?

Ответы [ 7 ]

17 голосов
/ 26 января 2009

Причина, по которой это происходит, заключается в том, что ваш макрос расширяет печать до:

printf("%d %d\n", j+5*5, (j+5)*5);

Значение:

1+5*5 and (1+5)*5
12 голосов
/ 26 января 2009

Поскольку это еще не было упомянуто, способ решить эту проблему заключается в следующем:

#define FTIMES(x) ((x)*5)

Скобки вокруг x в раскрытии макроса предотвращают проблему ассоциативности операторов.

3 голосов
/ 26 января 2009

define - это просто подстановка строк.

Ответ на ваш вопрос после этого - порядок действий:

FTIMES (j + 5) = 1 + 5 * 5 = 26

FTIMES ((j + 5)) = (1 + 5) * 5 = 30

2 голосов
/ 26 января 2009

Предварительный процесс компилятора просто выполняет подстановку FTIMES везде, где он его видит, а затем компилирует код. На самом деле код, который видит компилятор, таков:

#define NUM 5
#define FTIMES(x)(x*5)

int main(void)
{

    int j = 1;

    printf("%d %d\n", j+5*5,(j+5)*5);
}

Затем, учитывая предпочтения оператора, вы можете понять, почему вы получаете 26 и 30.

1 голос
/ 26 января 2009

И если вы хотите это исправить:

#define FTIMES(x) ((x) * 5)
0 голосов
/ 26 января 2009

Порядок операций.

FTIMES (j + 5), где j = 1 оценивается как:

1 + 5 * 5

Что такое:

25 + 1

= 26

Сделав FTIMES ((j + 5)), вы изменили его на:

(1 + 5) * 5

6 * 5

30

0 голосов
/ 26 января 2009

препроцессор заменяет все вхождения NUM в коде на 5, а все FTIMES (x) на x * 5. Затем компилятор компилирует код.

Это просто текстовая подстановка.

...