Macros C预处理器定义/宏

Macros C预处理器定义/宏,macros,Macros,我想弄清楚是否有可能实现我想用defines实现的目标。在下面的例子中,我使用了height,我试图创建两组参数的定义,我可以通过索引访问这些定义。但是,此索引可能会更改,但参数仍应可访问 #define INDEX_M 0 #define INDEX_Y 1 #define HEIGHT_MALE 60 #define HEIGHT_FEMALE 50 #define HEIGHT_##INDEX_M HEIGHT_MALE #define HEIGHT_#

我想弄清楚是否有可能实现我想用defines实现的目标。在下面的例子中,我使用了height,我试图创建两组参数的定义,我可以通过索引访问这些定义。但是,此索引可能会更改,但参数仍应可访问

#define INDEX_M      0
#define INDEX_Y      1

#define HEIGHT_MALE    60
#define HEIGHT_FEMALE  50

#define HEIGHT_##INDEX_M   HEIGHT_MALE
#define HEIGHT_##INDEX_F   HEIGHT_FEMALE
将被用作:

for (int i = 0; i < database_size; i++){
    printf("Height requirement for person %d is: %d", i, HEIGHT_(person[i].gender));
}
通过这种方式,我们可以更改male/female的索引以匹配数据库的定义,并且仍然可以使用此代码


我尝试过使用宏,但遇到的问题是,它不允许我在定义的前半部分使用符号。

否。这不起作用。您混合了编译时定义和运行时表达式求值功能。

我最终得出以下结论:

#define __HEIGHT_(X) ((X == INDEX_M) ? HEIGHT_MALE : (X == INDEX_M) ? HEIGHT_FEMALE : 0)
现在我可以这样称呼:

printf("%d", __HEIGHT(INDEX_M));
> 60
这似乎正在产生我想要的结果。有什么我遗漏的吗

编辑:改进为通用,如下所示:

#define ATTRIBUTE_GET(param, gender)((gender == INDEX_M) ? param ##_MALE : (gender == INDEX_F) ? param ##_FEMALE : 0)
用作:

printf("%d", ATTRIBUTE_GET(HEIGHT, INDEX_M));

请注意,包含两个连续下划线的变量名是为编译器保留的,我相信,因此使用uuu HEIGHT_uu是有潜在危险的。