C enum-like 预处理器定义点访问 "fields"?

C enum-like preprocessor define with dot access to "fields"?

我想,我想要的是类似于此 C++ 帖子 Accessing to enum values by '::' in C++ :

I want to: ... access Color values as Color::Red.


In current C++ (i.e. C++11 and beyond), you can already access enum values like that:

enum Color { Red };
Color c = Color::Red;

所以,我想知道 - 我可以在 C 中执行类似级别的访问,但通过定义(这样我就不必创建额外的变量)吗?例如,假设我有这个代码:

#include <stdio.h>

int model_type = 1;
int model_variant = 4;

int main(void) {
  printf("Hello World %d\n", model_variant);
  return 0;
}

我想写这样的东西:

int model_type = DEFAULT.MODEL_TYPE;
int model_variant = DEFAULT.MODEL_VARIANT;

我知道宏名称(通过 Can you use a.b notation in a #define macro name?):

They cannot contain dot.

...但我仍然想知道 - 是否有某种技巧,所以我可以实现这样的目标(能够通过说 DEFAULT.MODEL_TYPE 访问数值)在 C 的预处理器级别?我想要预处理器,因为它只会在需要的地方插入原始数字 - 否则我必须定义一个结构,然后是该结构类型的变量,然后填充该变量 ...

如果没有,是否有其他类似输入风格的选项 - 比如直接按名称访问枚举字段? (我试过 enum DEFAULTS { MODEL_TYPE =1, MODEL_VARIANT = 4 };,但是 DEFAULTS 然后是 "undeclared identifier",因此,DEFAULT.MODEL_TYPE 也不起作用 - 所以从这个意义上说,我不能将它用于我的目的)...

object . foo 在 C 中表示(大约)"add an offset (associated with foo) to (char*)&object cast the result to a pointer to the type associated with foo and then dereference".

与面向对象的编程语言不同,C 的 ./-> 不是用于访问与对象关联的事物的运算符以某种方式

如果您不想向左值的地址添加偏移量,您应该以不同的方式将事物组合在一起,例如,通过一个公共前缀:

enum DEFAULTS { DEFAULTS__MODEL_TYPE =1, DEFAULTS__MODEL_VARIANT = 4 };