C #define宏

4

以下是我的内容,我想知道它是如何工作的以及它实际上做了什么。

#define NUM 5
#define FTIMES(x)(x*5)

int main(void) {
    int j = 1;
    printf("%d %d\n", FTIMES(j+5), FTIMES((j+5)));
}

它产生了两个整数:26和30。
它是如何做到的呢?
7个回答

18
这种情况发生的原因是因为您的宏将打印内容展开为:
printf("%d %d\n", j+5*5, (j+5)*5);

含义:

1+5*5 and (1+5)*5

这应该教会我们一个宝贵的教训,避免使用 #define 宏来处理实际上应该由内联函数处理的事情。 - Calyth
或者,当你无法避免它们时,在每个参数的每个出现位置加上括号,并将整个宏放在括号中(即当你的宏是表达式而不是语句时)。 - user3458

13

既然还没有提到,解决这个问题的方法是按照以下步骤进行:

#define FTIMES(x) ((x)*5)

宏展开中x周围的括号是为了避免操作符结合性问题。


如果您在宏中有多个参数出现,并且传递带有副作用的表达式(例如 j += 3),那么这种方法就无法解决您的问题。 - rmeador

3

define只是字符串替换。

在此之后,你的问题的答案是操作顺序:

FTIMES(j+5) = 1+5*5 = 26

FTIMES((j+5)) = (1+5)*5 = 30


2
编译器预处理只是在看到FTIMES时进行替换,然后编译代码。因此,实际上编译器看到的代码如下所示:
#define NUM 5
#define FTIMES(x)(x*5)

int main(void)
{

    int j = 1;

    printf("%d %d\n", j+5*5,(j+5)*5);
}

然后,考虑到操作员的偏好,您可以看到为什么会得到26和30。

1
从技术上讲,编译器看不到 #defines。 :) - Greg Hewgill

1

如果你想修复它:

#define FTIMES(x) ((x) * 5)

0

预处理器将代码中所有的NUM替换为5,将所有的FTIMES(x)替换为x * 5。编译器然后编译代码。

这只是文本替换。


0

操作次序。

当 j=1 时,FTIMES(j+5) 的计算过程为:

1+5*5

结果为:

25+1

=26

如果改成 FTIMES((j+5)),那么它的计算过程变成:

(1+5)*5

6*5

30


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接