gpt4 book ai didi

c - 宏输出说明

转载 作者:行者123 更新时间:2023-12-04 12:30:09 25 4
gpt4 key购买 nike

当我运行下面的代码时,

#include<stdio.h>
#define X (4+Y)
#define Y (X+3)

int main()
{
printf("%d",4*X+2);
return 0;
}

I am getting the following output:
Error: Undefined symbol 'X'

有人可以解释一下输出吗?

最佳答案

这是因为宏需要和参数,因为它是用括号定义的。您需要将其定义为

#define X 4+Y#define Y X+3。然后你会遇到另一个麻烦,因为宏中的循环定义。

如 Drew 所建议的那样更正确;当示例在定义宏时可编译时,通常将括号放在表达式周围以确保预期的运算符优先级。

所以你最好的选择是:

#define X (4+Y)
#define Y (X+3)

非常接近您的初始示例,只是宏名称与其定义之间的空格字符。 但是,由于循环引用,仍然无法正确扩展宏。

如何检查发生了什么:

您可以使用 gcc -E,它会输出一个预处理文件。它会生成大量输出,所以我使用了 tail。我还使用 2>err 将错误流重定向到一个文件,所以输出很清楚。

luk32:~/projects/tests$ gcc -E ./cyclic_macro_with_no_spaces.c 2> err | tail -n 6

int main()
{
printf("%d",4*X+2);
return 0;
}


luk32:~/projects/tests$ gcc -E ./cyclic_macro.c 2> err | tail -n 6

int main()
{
printf("%d",4*(4+(X+3))+2);
return 0;
}

在第一个示例中,X 根本没有展开。而在后者中,两个宏都得到了扩展,尽管只有一个。给出与 Geoffrey 在他的回答中呈现的相同的输出。

无论是否没有空格是拼写错误,都存在 undefined symbol “X”。由于不同的原因,可以通过分析 err 文件来追踪。

关于c - 宏输出说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17838460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com