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 };
我想,我想要的是类似于此 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 };