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)功能。