C 预处理器变量连接“.”
C Preprocessor variable concatenation with "."
我知道有多个问答 [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 想法,那么它会告诉我 "pasting "。”并且 "PROPERTY" 没有提供有效的预处理标记”。
有人知道如何完成我需要的吗?它保持通用性并且我可以使用 var
是很重要的,因为我想在不同的变量名称上多次调用它。
它不起作用有两个原因:
令牌连接运算符禁止扩展用作其操作数的宏。所以你得到 nodePROPERTY
。 that 的解决方案是添加一个间接级别:
#define PROPERTY .value1
#define CONCAT(a, b) a##b
#define MAKE_PROP(var) CONCAT(var, PROPERTY)
现在 PROPERTY
在 被作为参数提供给 CONCAT
之前被展开 。
连接令牌的结果必须是 单个 有效令牌,但 node.value1
是 3 个令牌(node
,.
和 value1
).
现在,碰巧你根本不需要串联,你只需要构建表达式 (node .value1)
,这可以通过以下简单的宏来完成1:
#define PROPERTY value1
#define MAKE_PROP(var) ( (var).PROPERTY )
1:在Lundin的帮助下进行了简化。
我知道有多个问答 [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 想法,那么它会告诉我 "pasting "。”并且 "PROPERTY" 没有提供有效的预处理标记”。
有人知道如何完成我需要的吗?它保持通用性并且我可以使用 var
是很重要的,因为我想在不同的变量名称上多次调用它。
它不起作用有两个原因:
令牌连接运算符禁止扩展用作其操作数的宏。所以你得到
nodePROPERTY
。 that 的解决方案是添加一个间接级别:#define PROPERTY .value1 #define CONCAT(a, b) a##b #define MAKE_PROP(var) CONCAT(var, PROPERTY)
现在
PROPERTY
在 被作为参数提供给CONCAT
之前被展开 。连接令牌的结果必须是 单个 有效令牌,但
node.value1
是 3 个令牌(node
,.
和value1
).
现在,碰巧你根本不需要串联,你只需要构建表达式 (node .value1)
,这可以通过以下简单的宏来完成1:
#define PROPERTY value1
#define MAKE_PROP(var) ( (var).PROPERTY )
1:在Lundin的帮助下进行了简化。