C макросы и использование аргументов в скобках

пример

#define Echo(a)  a
#define Echo(a) (a)

Я понимаю, что здесь, вероятно, нет существенной разницы, но почему вы когда-нибудь захотите включить a в скобках внутри тела макроса? Как это изменить?

2 ответов


Предположим, у вас есть

#define mul(x, y)  x * y

что произойдет, если я говорю:

mul(a + 5, 6); /* a + 5 * 6 */

Теперь, если я slighlty изменить макрос:

#define mul(x, y)  ((x) * (y))
mul(a + 5, 6); /* ((a + 5) * (6)) */

помните, что аргументы не оцениваются или что-то еще, выполняется только текстовая подстановка.

редактировать

для объяснения наличия всего макроса в круглых скобках см. ссылке сообщение от Нейт К-К.


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

вы спрашиваете о разнице о:

#define Echo( a )  a
#define Echo( a ) ( a )

что нормально, пока вы не понимаете макрос, который он сам (я тоже не эксперт:)).

прежде всего, вы уже (вероятно) знаете, что есть приоритет оператора, поэтому существует огромная разница это две программы:

1):

#include <stdio.h>
#define ADD( a , b ) a + b

int main( void )
{
    auto const int a = 5;
    auto const int b = 10;

    auto const int c = ADD (  2 + a ,  2 + b );
    printf( "%d", c );
    return 0;
}

выход:

19

и:

#include <stdio.h>
#define ADD( a , b ) ( a ) + ( b )

int main( void )
{
    auto const int a = 5;
    auto const int b = 10;

    auto const int c = ADD ( a , b );
    printf( "%d", c );
    return 0;
}

выход:

15

теперь давайте preplace + С *:

#define ADD( a, b ) a * b

компилятор обрабатывает a == 5 и b == 10 что значит 5 * 10.

но, когда вы говорите: ADD ( 2 + a * 5 + b ) Как здесь:

#include <stdio.h>
#define ADD( a , b ) ( a ) * ( b )

int main( void )
{
    auto const int a = 5;
    auto const int b = 10;

    auto const int c = ADD ( 2 + a , 5 + b );
    printf( "%d", c );
    return 0;
}

вы получаете 105, потому что оператор приоритет участвует и лечит

2 + b * 5 + a

as

( 2 + 5 ) * ( 5 + 10 )

что это

( 7 ) * ( 15 ) ==105

но когда вы это сделаете:

#include <stdio.h>
#define ADD( a, b ) a * b

int main( void )
{
    auto const int a = 5;
    auto const int b = 10;

    auto const int c = ADD ( 2 + a , 5 + b );
    printf( "%d", c );
    return 0;
}

вы получаете 37 из-за

 2 + 5 * 5 + 10

что означает:

2 + ( 5 * 5 ) + 10

что означает:

2 + 25 + 10

короткий ответ, есть большая разница между:

#define ADD( a , b ) a * b

и

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