C定义语句、枚举、结构

C定义语句、枚举、结构,c,struct,enums,c-preprocessor,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,

我有一些遗留代码,其中包含以下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)
令牌simple_op稍后出现在结构中:

typedef struct simple_instr_struct {
    simple_op opcode;           /* the opcode */
有几件事我不明白:

在define语句末尾加一个逗号可以实现什么?我认为那是违法的

enum正在完成什么,特别是上一次

如何在简单的instr结构中访问操作码的值


它将把操作码提取为枚举

枚举需要逗号分隔,因此它采用操作码,并在操作码后加上一个,从而有效地生成

typedef enum simple_op_enum {
NOP_OP, BLAH , WHATEVER , ANOTHER ,
LAST_OP
} simple_op;
枚举的要点是拥有所有可用操作码的枚举

LAST_OP有助于了解最终的操作码数量,也意味着枚举列表中的最后一项没有悬空逗号


如果您有一个结构实例“blah”,那么可以通过blah.opcode=NOP_OP

定义末尾的逗号是合法的。这是宏的一部分。枚举的常量是用逗号分隔的,这个宏对此表示担忧

enum只是一个变量,可以包含在enum声明中指定的任何值。因为它们被转换为数字,所以最后一个运算将等于可能性的数量

您可以通过以下方式访问成员:

struct simple_instr_struct a;
a.opcode=LAST_OP;
逗号只是使用宏时将发生的文本替换的一部分。在这种情况下,最好在每个操作码后添加一个逗号,这样列表将生成有效的枚举语法

“定义并包含”的结果是一个如下所示的枚举:

typedef enum simple_op_enum {
  NOP_OP,
  .
  .
  .
  LAST_OP
} simple_op;
通过查看通过C预处理器运行源代码的输出,可以看到相同的情况。LAST_OP只是新枚举中的最后一个条目

您需要定义该类型的变量:

struct simple_instr_struct myStruct;
然后访问您关心的字段:

myStruct.opcode
这并不违法,它是预处理器将替换所有SOPx、y、z实例的一部分

它正在使用simple_ops.def中的内容创建一个枚举。因为该文件的内容是SOPw、x、y、z,所以它们都将变成w,枚举将是:

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

这个include是一个聪明的技巧,这样定义就可以放在同一个地方——文件和包含它的代码只是将SOP定义为它需要的任何东西。然后修改一个文件会影响需要它的整个代码,并且代码会以任何需要的方式使用它们。例如,一些代码可能只需要名称,因此它会将SOP定义为define SOPw,x,y,z x来提取名称


3您可以通过执行simple instr_struct_instance来访问它。操作码

如果对宏有疑问,您可以始终使用预处理器查看它们是如何展开的:

gcc-E file.c-o file.txt

如果包含许多头文件,则输出将很大,但您会在其中的某个位置找到宏-可能在末尾

这是LAST_OP的定义-它是一个枚举常量,特别是最后一个。
typedef enum simple_op_enum {
   NOP_OP , // <- notice the space before the comma, like the #define does
   ...      // the others
   LAST_OP
} simple_op;