AMT*_*erp 1 c macros preprocessor
我知道多Q&作为[的1,2 ]是紧密联系在这个问题上,我一直试图实现他们的解决方案,但事实证明,我需要使用.在我的连接中似乎给我带来了麻烦.
这就是我要的:
#include <stdio.h>
#define PROPERTY .value1
#define MAKE_PROP(var) var##PROPERTY
typedef struct {
int value1;
int value2;
} Node;
int main(void) {
Node node;
node.value1 = 1;
node.value2 = 2;
// MAKE_PROP(node) should evaluate to "node.value1".
printf("%d", MAKE_PROP(node));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然而它给了我各种各样的错误.如果我尝试[ 2 ]中的PASTER-EVALUATE想法,那么它会告诉我"粘贴"."和"PROPERTY"没有给出有效的预处理令牌".
谁知道如何完成我需要的东西?它必须保持一般,并且我可以使用,var因为这是我想在不同的变量名称上多次调用的东西.
这有两个原因:
令牌连接运算符禁止用作其操作数的宏的扩展.所以你得到了nodePROPERTY.该解决方案即是添加了一个间接层:
#define PROPERTY .value1
#define CONCAT(a, b) a##b
#define MAKE_PROP(var) CONCAT(var, PROPERTY)
Run Code Online (Sandbox Code Playgroud)
现在在被作为一个参数喂养之前得到PROPERTY扩展.CONCAT
连接令牌的结果必须是单个有效令牌,但是node.value13个令牌(node,.和value1).
现在,碰巧你根本不需要连接,你只需要构建(node .value1)可以用以下简单宏1完成的表达式:
#define PROPERTY value1
#define MAKE_PROP(var) ( (var).PROPERTY )
Run Code Online (Sandbox Code Playgroud)
1:在Lundin的帮助下简化.