C预处理器变量串联"."

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因为这是我想在不同的变量名称上多次调用的东西.

Sto*_*ica 6

这有两个原因:

  1. 令牌连接运算符禁止用作其操作数的宏的扩展.所以你得到了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

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

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

#define PROPERTY value1
#define MAKE_PROP(var) ( (var).PROPERTY )
Run Code Online (Sandbox Code Playgroud)

1:在Lundin的帮助下简化.