实施例
#define Echo(a) a
#define Echo(a) (a)
我意识到这里可能没有显着差异,但为什么你想在宏体内的括号内包含a
?它是如何改变它的?
答案 0 :(得分:13)
假设你有
#define mul(x, y) x * y
如果我说:
会发生什么mul(a + 5, 6); /* a + 5 * 6 */
现在,如果我轻松改变宏:
#define mul(x, y) ((x) * (y))
mul(a + 5, 6); /* ((a + 5) * (6)) */
请记住,不会评估参数或任何内容,只会执行文本替换。
答案 1 :(得分:1)
为了记录,我从这里How to fix mathematical errors while using macros登陆,我将尝试在此处扩展此答案,以适应其他人。
您在询问有关的区别:
#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
现在让+
预先放置*
:
#define ADD( a, b ) 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
作为
( 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 )