Macros C预处理器定义/宏
我想弄清楚是否有可能实现我想用defines实现的目标。在下面的例子中,我使用了height,我试图创建两组参数的定义,我可以通过索引访问这些定义。但是,此索引可能会更改,但参数仍应可访问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_#
#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是有潜在危险的。