Разница между использованием макроса и его расширением - PullRequest
1 голос
/ 24 сентября 2010
#define ADD(a,b) (a)+(b)

void foo1()
{
    int a=1, b=2;
    int k=0;
    while(k++ < 10000)
    {
        int c = ADD(a,b);
        a = c;
    }
}

void foo2()
{
    int a=1, b=2;
    int k=0;
    while(k++ < 10000)
    {
        int c = a + b;
        a = c;
    }
}

в чем разница между foo1 и foo2.Кто-то задал мне этот вопрос, и я не смог найти никакой разницы.оба кажутся на 100% одинаковыми.Может быть, какая-то разница в распределении памяти в стеке?Вы можете попытаться ответить на вопрос, предположив, что память очень ограничена?

Ответы [ 5 ]

5 голосов
/ 24 сентября 2010

Единственная разница связана с тем, что вместо написания макроса, как вы, вам нужно заключить весь макрос в дополнительный набор символов:

#define ADD(a,b) ((a)+(b))

Если вы не сделаетеэто исправление, тогда

ADD(3,4) * 5

равняется 23, но

(3 + 4) * 5

равняется 34.

Хорошо, что вы правильно заключили каждый параметр макроса в свои собственные парены,но вам также нужно заключить весь макрос в скобки, чтобы избежать ошибок, связанных с приоритетом.

4 голосов
/ 24 сентября 2010

Насколько я знаю, это точно так же.

Макрос раскрывается в препроцессоре, а затем компилируется. Таким образом, чистый результат абсолютно одинаков как по стоимости, так и по памяти.

Единственное отличие состоит в том, что предварительная обработка может занять немного больше времени. (Хотя и незначительный)

3 голосов
/ 24 сентября 2010

Как они сказали, но есть разница в том, что ADD(5, 5) * 5 будет оцениваться до 50, тогда как 5 + 5 * 5 будет оцениваться до 30. На самом деле, как вы их определили, оба будут 30поэтому обязательно добавьте дополнительные скобки в ваше определение: #define ADD(a,b) ((a)+(b))

1 голос
/ 24 сентября 2010

Нет никакой разницы, препроцессор запускается до компиляции кода и просто выполняет тупую замену.

0 голосов
/ 24 сентября 2010

Что касается компилятора C, то для этого требуется чуть-чуть меньше работы.

Одним из этапов компиляции исходных файлов является предварительная обработка. Одним из этапов предварительной обработки является расширение макроса.

Когда вы раскрываете макрос вручную, компилятору это делать не нужно.

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