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 是很重要的,因为我想在不同的变量名称上多次调用它。

它不起作用有两个原因:

  1. 令牌连接运算符禁止扩展用作其操作数的宏。所以你得到 nodePROPERTYthat 的解决方案是添加一个间接级别:

    #define PROPERTY .value1
    #define CONCAT(a, b) a##b
    #define MAKE_PROP(var) CONCAT(var, PROPERTY)
    

    现在 PROPERTY 被作为参数提供给 CONCAT 之前被展开

  2. 连接令牌的结果必须是 单个 有效令牌,但 node.value1 是 3 个令牌(node.value1).

现在,碰巧你根本不需要串联,你只需要构建表达式 (node .value1),这可以通过以下简单的宏来完成1:

#define PROPERTY value1
#define MAKE_PROP(var) ( (var).PROPERTY )

1:在Lundin的帮助下进行了简化。