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