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 )