关于 C 中宏扩展的困惑
Confusion about macro expansion in C
#include <stdio.h>
#define MYNUMBER 123
int main()
{
printf("%d", MYNUMBER456);
}
以上代码无效,因为 MYNUMBER
和 MYNUMBER456
是不同的标记。
#include <stdio.h>
#define SECOND(a, b) printf(#a #b);
#define FIRST SECOND
int main()
{
FIRST(hello, world!)
}
但是这个效果很好。我的想法是 FIRST
和 FIRST(hello, world!)
不同,所以它不应该起作用。我错过了什么?
你是对的 MYNUMBER
和 MYNUMBER456
是不同的,预编译器不知道如何使用 MYNUMBER456
但是,当您将 FIRST
定义为 SECOND
时,预编译器会将 FIRST
扩展 SECOND
然后您实际上有 SECOND
和 2 个参数,因此它可以工作
您可以使用 -E 选项 (cc -E main.c) 来查看宏扩展,但由于您的 #include ,您会看到插入了很多其他内容,如果没有它,您可能会看到插入了一些默认内容,在您的示例中,主要功能变为
int main()
{
printf("hello" "world!");
}
这是因为您已将 FIRST 定义为与 SECOND 相同,后者采用两个参数并将它们设为字符串,并且由于它们之间没有逗号,因此它们被连接成一个字符串,宏只是字符串替换,在 C 中预处理传统上由编译器的单独可执行文件处理,并不像编译器那么复杂,因此您在大多数语言中期望的类型匹配不适用于预处理器。
#include <stdio.h>
#define MYNUMBER 123
int main()
{
printf("%d", MYNUMBER456);
}
以上代码无效,因为 MYNUMBER
和 MYNUMBER456
是不同的标记。
#include <stdio.h>
#define SECOND(a, b) printf(#a #b);
#define FIRST SECOND
int main()
{
FIRST(hello, world!)
}
但是这个效果很好。我的想法是 FIRST
和 FIRST(hello, world!)
不同,所以它不应该起作用。我错过了什么?
你是对的 MYNUMBER
和 MYNUMBER456
是不同的,预编译器不知道如何使用 MYNUMBER456
但是,当您将 FIRST
定义为 SECOND
时,预编译器会将 FIRST
扩展 SECOND
然后您实际上有 SECOND
和 2 个参数,因此它可以工作
您可以使用 -E 选项 (cc -E main.c) 来查看宏扩展,但由于您的 #include
int main()
{
printf("hello" "world!");
}
这是因为您已将 FIRST 定义为与 SECOND 相同,后者采用两个参数并将它们设为字符串,并且由于它们之间没有逗号,因此它们被连接成一个字符串,宏只是字符串替换,在 C 中预处理传统上由编译器的单独可执行文件处理,并不像编译器那么复杂,因此您在大多数语言中期望的类型匹配不适用于预处理器。