我知道多个Q& As [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;
}
然而,它给了我各种各样的错误。如果我尝试[2]中的PASTER-EVALUATE创意,那么它会告诉我&#34;粘贴&#34;。&#34;和&#34; PROPERTY&#34;没有提供有效的预处理令牌&#34;。
任何人都知道如何完成我需要的工作?它必须保持一般性并且我可以使用var
,因为这是我想在不同变量名称上多次调用的事情。
答案 0 :(得分:6)
这有两个原因:
令牌连接运算符禁止扩展用作其操作数的宏。所以你得到nodePROPERTY
。 的解决方案是添加一个间接级别:
#define PROPERTY .value1
#define CONCAT(a, b) a##b
#define MAKE_PROP(var) CONCAT(var, PROPERTY)
现在PROPERTY
在将作为参数提供给CONCAT
之前展开。
连接令牌的结果必须是单个有效令牌,但node.value1
是3个令牌(node
,.
和{{1 }})。
现在,碰巧你根本不需要连接,你只需要构建表达式value1
,这可以用以下简单的宏 1 完成:
(node .value1)
1:在Lundin的帮助下进行了简化。 子>