简单的C预处理器替换

时间:2015-02-23 21:07:49

标签: c c-preprocessor

所以我编写了一个简单的程序来尝试对#define宏进行更基本的理解,我想知道这两个程序之间有什么区别,是否有使用第三个程序的根本原因? :

#include<stdio.h>
#define x 7

int main()
{
    int i;
    i = x * x * x;
    printf("%d", i);
    return 0;
}

该程序打印出343因为7 * 7 * 7 = 343

#include<stdio.h>
#define x 5+2

int main()
{
    int i;
    i = x * x * x;
    printf("%d", i);
    return 0;
}

该程序从操作顺序打印出27。 编辑 强制第二个打印343的方法我们可以添加括号,以便我们可以执行以下操作:

#include<stdio.h>
#define x (5+2)

int main()
{
    int i;
    i = x * x * x;
    printf("%d", i);
    return 0;
}

有没有理由这样做而不是第一种方式呢?

1 个答案:

答案 0 :(得分:3)

宏替换替换文本,因为它是

因此C编译器看到代码

i = 7 * 7 * 7;       // when #DEFINE x 7

在一个案例中,以下内容在另一个案例中

i = 5+2 * 5+2 * 5+2; // when #DEFINE x 5+2

(由于简单的arthihmetic优先权,结果是微不足道的。)


要使它们等效,需要添加括号,例如(首选,请参阅注释):

#define x (5+2)

虽然以下“足够”在这里

i = (x) * (x) * (x);