使用宏与其扩展之间的区别

viv*_*k.m 1 c

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

void foo1()
{
    int a=1, b=2;
    int k=0;
    while(k++ < 10000)
    {
        int c = ADD(a,b);
        a = c;
    }
}

void foo2()
{
    int a=1, b=2;
    int k=0;
    while(k++ < 10000)
    {
        int c = a + b;
        a = c;
    }
}
Run Code Online (Sandbox Code Playgroud)

foo1和foo2有什么区别.有人问我这个问题,我找不到任何区别.两者似乎100%相同.关于堆栈上的内存分配可能有些不同?您可以尝试回答这个问题,假设记忆非常有限吗?

Alc*_*ive 5

唯一的区别与以下事实有关:您需要将整个宏包含在另外一组parens中,而不是像您一样编写宏:

#define ADD(a,b) ((a)+(b))
Run Code Online (Sandbox Code Playgroud)

如果你没有做出那个修复,那么

ADD(3,4) * 5
Run Code Online (Sandbox Code Playgroud)

等于23,但是

(3 + 4) * 5
Run Code Online (Sandbox Code Playgroud)

等于34.

这是伟大的,你没有正确地包围在自己的括号每个宏参数,但你还需要附上整个宏在括号避免precendence相关的错误.