C预处理器定义/宏

C pre-processor define/macro

我想知道是否有可能用定义来完成我想要完成的工作。我基本上尝试创建两组参数定义(在下面的示例中,我使用了高度),我可以通过索引访问这些定义。但是,此索引可能会更改,但参数仍然可以访问。

1
2
3
4
5
6
7
8
#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

将用作:

1
2
3
for (int i = 0; i < database_size; i++){
    printf("Height requirement for person %d is: %d", i, HEIGHT_(person[i].gender));
}

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

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


最后我想到了:

1
#define __HEIGHT_(X) ((X == INDEX_M) ? HEIGHT_MALE : (X == INDEX_M) ? HEIGHT_FEMALE : 0)

现在我可以这样称呼:

1
2
printf("%d", __HEIGHT(INDEX_M));
> 60

这似乎产生了我想要的结果。我有什么东西不见了吗?

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

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

用作:

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


不,这不行。您混合了编译时(define)和运行时(expression evaluation)功能。