C预处理器定义/宏

时间:2015-08-28 21:48:24

标签: macros

我试图弄清楚我是否有可能做我想用定义完成的事情。我基本上试图创建两组参数定义(在下面我使用高度的示例中),我可以通过索引访问。但是,此索引可能会更改,但参数仍应可访问。

#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));
}

这样,我们可以更改男性/女性的索引以匹配数据库的定义,并且仍然可以使用此代码。

我尝试过使用宏,但我遇到的问题是它不会让我在定义的前半部分使用##表示法。

2 个答案:

答案 0 :(得分:0)

没有。这不行。您正在混合编译时(#define)和运行时(表达式评估)功能。

答案 1 :(得分:0)

我最终得到了这个:

#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));