2

因此,首先,这是代码,将实际名称切换为通用名称以减少混淆。

/* Get the list of Hotkey commands */
#define A_COMMANDS_MACRO(a, b, c, d) a = b ,
enum {
#include "commandsFile.def"
} ;
#undef  A_COMMANDS_MACRO

这是一些源代码的片段,我一直在查看并考虑使用分叉来熟悉C编程语言的复杂性。因此,在我未经训练的眼睛看来,这似乎无济于事。对我的大脑来说,定义一些东西然后立即取消它似乎会相互抵消。

显然,我意识到我错了。但为什么我错了?

4

3 回答 3

5

“commandsFile.def”文件可能在内部某处使用了“A_CO​​MMANDS_MACRO”宏。

请记住,“#include”本质上是将包含的文件粘贴到包含文件中,因此在处理“commandsFile.def”时,#define 仍然有效。

于 2010-12-18T16:29:37.307 回答
4

commandsFile.def应该包含许多行:

A_COMMANDS_MACRO(A_COMMAND, 10, na, na)
A_COMMANDS_MACRO(OTHER_COMMAND, 23, na, na)

这样代码将创建一个包含可用命令及其代码的枚举。

当这个 .def 文件被用其他语言编写的程序使用时,它可能很有用,因此它不是实现文本解析,而是使用 C 预处理器来执行此操作。

于 2010-12-18T16:33:05.707 回答
4

您在那里看到的通常称为 X-MACRO。该技术包括通过 定义宏#define,然后包含一个使用它们的文件#include

作为一个非常简单的示例,您可以有一个标头(例如myheader.h),它以以下形式声明了 2 个函数:

int foo(MYTYPE a, MYTYPE_PTR b);
void bar(MYTYPE a, MYTYPE_PTR b);

然后,在您的代码中:

#define MYTYPE int
#define MYTYPE_PTR int*
#include "myheader.h"
#undef MYTYPE
#undef MYTYPE_PTR

#undefs 有时也在包含的文件中。

有关更多信息,请查看此 Wikipedia 链接

于 2010-12-18T16:39:31.147 回答