【问题标题】:I am a bit lost as to the meaning of this C preprocessor statement,我对这个 C 预处理器语句的含义有点迷茫,
【发布时间】:2011-05-27 14:33:38
【问题描述】:

所以,首先,这里是代码,将实际名称转换为通用名称以减少混淆。

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

这是我一直在查看的一些源代码中的 sn-p,并考虑将分叉作为一种让自己熟悉 C 编程语言的复杂性的方法。因此,在我未经训练的眼睛看来,这似乎无济于事。对我的大脑来说,定义一些东西然后立即取消它似乎会相互抵消。

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

【问题讨论】:

  • #define 应用于 commandsFile.def 文件的包含。发布它。

标签: c c-preprocessor undef


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您在那里看到的通常称为 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 有时也在包含的文件中。

    欲了解更多信息,请查看at this Wikipedia link

    【讨论】:

    • 这太棒了。下一个问题:由于没有名称,如何引用该枚举?就此而言,枚举的意义何在?为什么不直接包含文件?
    • @KenB:这可能只是一种检查命令名称是否唯一和“语法检查”.def 文件的方法。
    【解决方案3】:

    commandsFile.def 应该包含很多行:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 2016-04-09
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多