【问题标题】:C Preprocessor concatenation with variable [duplicate]C预处理器与变量的连接[重复]
【发布时间】:2012-12-05 02:17:55
【问题描述】:

可能重复:
C preprocessor and concatenation

是否可以将 C 预处理器与变量名连接起来?

#define  WIDTH 32

int dataWIDTH;


// dataWIDTH should be interpreted as 'data32'

printf("%d",dataWIDTH);

【问题讨论】:

    标签: c variables concatenation c-preprocessor


    【解决方案1】:

    您的用例需要双重转义;单独使用标记粘贴 (##) 运算符只会附加预处理器指令的名称。

    #define WIDTH 32
    
    #define _MAKEDATA(n) data##n
    #define MAKEDATA(n) _MAKEDATA(n)
    
    int MAKEDATA(WIDTH) = 7;
    int _MAKEDATA(WIDTH) = 8;
    
    int main(int argc, char *argv[]) {
        printf("%d\n", data32);
        return 0;
    }
    

    产量

    $ gcc -E foo.c 
    int data32 = 7;
    int dataWIDTH = 8;
    
    int main(int argc, char *argv[]) {
        printf("%d\n", data32);
        return 0;
    }
    

    【讨论】:

    【解决方案2】:

    有一个名为 ## 的标记粘贴运算符,例如在这里阅读它:

    http://msdn.microsoft.com/en-us/library/09dwwt6y(v=vs.80).aspx

    【讨论】:

    • 预处理器将此扩展为printf("%d", data##32),这会产生编译器错误。我的理解是令牌粘贴仅适用于宏内部。
    • 该示例是由另一个用户添加的,提供的链接显示了如何在宏中使用令牌粘贴。
    猜你喜欢
    • 1970-01-01
    • 2012-03-28
    • 2011-04-22
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 2015-09-13
    • 2014-07-30
    • 1970-01-01
    相关资源
    最近更新 更多