C预处理器变量连接与"。"

时间:2017-03-12 06:30:12

标签: c macros preprocessor

我知道多个Q& As [12]在这个问题上有密切关系,我试图实施他们的解决方案,但事实是我需要使用。在我的连接似乎给我带来了麻烦。

这就是我想要的:

#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,因为这是我想在不同变量名称上多次调用的事情。

1 个答案:

答案 0 :(得分:6)

这有两个原因:

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

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

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

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

  3. 现在,碰巧你根本不需要连接,你只需要构建表达式value1,这可以用以下简单的宏 1 完成:

    (node .value1)

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