C#define 语句、枚举、结构

标签 c struct enums c-preprocessor

我有一些包含此 typedef 的遗留代码:

typedef enum simple_op_enum {
    #define SOP(OPCODE, NAME, FORM, SUIFOP) OPCODE ,
    #include "simple_ops.def"
    LAST_OP
} simple_op;

#include 文件包含以下形式的几行:

/*  no operand instructions */
SOP( NOP_OP,    "nop ",     BASE_FORM,  io_nop)

token “simple_op”稍后出现在结构中:

typedef struct simple_instr_struct {
    simple_op opcode;           /* the opcode */

有几件事我不明白:

  1. 在#define 语句末尾添加一个逗号有何作用?我认为那是非法的。

  2. 枚举完成了什么,尤其是 LAST_OP

  3. 如何访问 simple_instr_struct 中操作码的值?

最佳答案

  1. 这不是非法的,它是预处理器将替换 SOP(x, y, z) 的所有实例的一部分。

  2. 它正在用 simple_ops.def 中的内容创建一个枚举。因为该文件的内容是 SOP(w, x, y, z) 它们都会变成 wenum 将是:

typedef enum simple_op_enum {
   NOP_OP , // <- notice the space before the comma, like the #define does
   ...      // the others
   LAST_OP
} simple_op;

它还使 LAST_OP 成为最后一个枚举值。这可能是因为代码可以使用 LAST_OP 来确定有多少枚举值(或最高枚举值,或类似的东西)。

#include 是一个聪明的技巧,因此定义可以全部在同一个地方(文件)和 #include 的代码它只是定义SOP 成为它需要的任何东西。然后修改该文件将影响需要它的整个代码,并且代码以任何需要的方式使用它们。例如,某些代码可能只需要名称,因此它会将 SOP 定义为 #define SOP(w, x, y, z) x 以提取名称。

3) 您可以通过执行 simple_instr_struct_instance.opcode

访问它

关于C#define 语句、枚举、结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9013020/

相关文章:

c - 如何从文件中正确添加 gdi32.lib?

c++ - 无法从不同的类中检索结构内部的值(返回 0)

c - 如何正确初始化链表

c++ - -ffast-math 可以安全地用于典型项目吗?

c - 绑定(bind)时间和C赋值语句

c - 尝试使用 fwrite 在 C 中以二进制/十六进制写入字符串

c++ - 什么时候在 C++ 中使用 struct over class

java - 如何在 Frege native 声明中声明 Java 枚举?

c# - 使用 C# 枚举标志根据按位或运算的值返回一组值

.net - 在 NHibernate 中映射枚举集合