C宏和括号中的参数使用

时间:2011-08-25 07:22:13

标签: c macros c-preprocessor parentheses

实施例

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

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

2 个答案:

答案 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)) */

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

修改

有关在括号中包含整个宏的说明,请参阅the link发布的Nate C-K

答案 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 == 5b == 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 )