Это не незаконно, это часть того, что препроцессор заменит все экземпляры 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
s, он просто определяет, SOP
- это то, что ему нужно.Затем изменение этого одного файла повлияет на весь код, который нуждается в нем, и код использует их так, как ему нужно.Например, для некоторого кода может потребоваться только имя, поэтому для извлечения имени будет определено SOP
как #define SOP(w, x, y, z) x
.
3) Вы можете получить к нему доступ, выполнив simple_instr_struct_instance.opcode