C 预处理器 define/macro
C pre-processor define/macro
我想弄清楚是否可以用定义来完成我想完成的事情。我本质上是在尝试创建 2 组参数定义(在下面的示例中我使用了高度),我可以通过索引访问它们。然而这个索引可能会改变,但参数应该仍然可以访问。
#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) 和 运行 时(表达式求值)功能。
我最终得到了这个:
#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));
我想弄清楚是否可以用定义来完成我想完成的事情。我本质上是在尝试创建 2 组参数定义(在下面的示例中我使用了高度),我可以通过索引访问它们。然而这个索引可能会改变,但参数应该仍然可以访问。
#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) 和 运行 时(表达式求值)功能。
我最终得到了这个:
#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));