18

例子

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

我意识到这里可能没有显着差异,但你为什么要a在宏体内包含括号内?它如何改变它?

4

2 回答 2

22

假设你有

#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)) */

请记住,不会评估参数或任何其他内容,仅执行文本替换。

编辑

有关将整个宏放在括号中的说明,请参阅Nate CK发布的链接

于 2011-08-25T07:23:31.617 回答
1

只是为了记录,我从这里登陆如何在使用宏时修复数学错误,我将尝试在此处扩展此答案以适合另一个答案。

您正在询问有关以下方面的区别:

#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 * blikea == 5b == 10which does 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 )
于 2018-02-10T17:13:06.500 回答