我有一些包含此 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 */
有几件事我不明白:
在#define 语句末尾添加一个逗号有何作用?我认为那是非法的。
枚举完成了什么,尤其是 LAST_OP
如何访问 simple_instr_struct 中操作码的值?
最佳答案
这不是非法的,它是预处理器将替换
SOP(x, y, z)
的所有实例的一部分。它正在用
simple_ops.def
中的内容创建一个枚举。因为该文件的内容是SOP(w, x, y, z)
它们都会变成w
,enum
将是:
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/