gpt4 book ai didi

c - 为什么宏定义 "#define yyparse ol_parser_parse"可以工作?

转载 作者:太空宇宙 更新时间:2023-11-04 07:47:52 24 4
gpt4 key购买 nike

之前,我没有从 yacc 读取生成的代码小心。现在我看到了这样一段代码:

#define yyparse ol_parser_parse

我知道yyparse的定义如下:

int yyparse (void) 

因此,这个宏定义应该解释为:代码中的每个“ol_parser_parse”都将被“yyparse”替换。我写了一些代码来测试:

#include <stdio.h>
#define yyparse ol_parser_parse
void yyparse()
{
printf("hello world\n");
}
void main()
{
ol_parser_parse();
}

成功了!但是根据关于"macro definition"的定义:

#define <identifier>(<parameter list>) <replacement token list>

我对此感到困惑。谁能帮我解释一下?提前致谢!

最佳答案

这是执行替换后编译器看到的代码:

#include <stdio.h>

void ol_parser_parse()
{
printf("hello world\n");
}
void main()
{
ol_parser_parse();
}

在这一点上没有什么神秘的。在 #define 之后的每一行,“yyparse”的每个实例都变成“ol_parser_parse”。

在文档中,标识符 表示被替换的内容,替换标记列表 是您要替换的内容。您还可以有参数,例如:

#define TIMES_TWO(n) ((n) * 2)

然后你可以做什么:

int x = TIMES_TWO(3);

相当于:

int x = ((3) * 2);

额外的括号在哪里,这样你就可以做到这一点而不会弄乱操作顺序:

int x = TIMES_TWO(1 - 5);

如果没有括号,它会显示为:

int x = 1 - 5 * 2;

计算结果为 1 - 10,这不是您想要的。

有效地使用#define 来隐藏难看的实现细节是一门艺术。如果您可以使用 yyparser 宏,则您无需担心 ol_parser_parse 这个名称。这使实现者可以自由地重命名该函数和相应的宏,而不会破坏您的所有代码。

关于c - 为什么宏定义 "#define yyparse ol_parser_parse"可以工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55778658/

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