C宏,奇怪的东西

时间:2015-11-08 12:09:58

标签: c

试图在C宏中找出简单的东西, 像这样的代码例如:

#include <stdio.h> 
#define MACRO(b)  printf("%d\n", b*b)

int main()
{
    MACRO(4+1); 
}

此代码的输出为9,我认为它应该是25。 我不知道为什么以及如何结果是9而不是25。

2 个答案:

答案 0 :(得分:1)

在宏周围放置括号,以正确的顺序评估参数:

#include <stdio.h> 
#define MACRO(b)  printf("%d\n", (b)*(b))

int main()
{
    MACRO(4+1); 
}

答案 1 :(得分:1)

当您使用宏时,预处理器会逐字替换它及其参数,因此代码中的宏扩展将如下所示

printf("%d\n", 4+1*4.1);

这不会为您提供您想要的结果,这也是类似函数的宏被忽视的原因之一。

您需要使用括号来确保不会出现此问题:

#define MACRO(b)  printf("%d\n", (b)*(b))

然后会导致以下扩展:

printf("%d\n", (4+1)*(4.1));

每当您遇到与预处理器相关的问题时,几乎所有编译器都可以选择在预处理阶段之后停止,这样您就可以查看预处理的源代码,这将帮助您解决这类问题。

另请注意,另一个可能存在的问题是,如果作为参数传递给宏的表达式是一个具有一些副作用的函数调用,该函数将被调用两次,副作用将发生两次,即使使用括号也是如此。

一个简单的例子,使用你的宏:

int my_function(void)
{
    printf("Foo\n");
    return 1;
}

int main(void)
{
    MACRO(my_function());
}

上述程序将打印"Foo\n" 两次。如果MACRO是一个正确的函数,则对my_function的调用只会发生一次,函数的打印输出只会发生一次。