【问题标题】:Token concatenation in GNU C/C++ macroGNU C/C++ 宏中的标记连接
【发布时间】:2015-02-03 18:46:05
【问题描述】:

我希望编写一个宏来输出表达式的文本及其值,例如

int a = 2;
PRINT(a + 1);

应该输出

a + 1 = 3

C/C++ Macro string concatenation 显示了令牌连接的使用。然而,

#define PRINT(x) std::cout << x " = " << x << "\n"

#define PRINT(x) std::cout << (x) " = " << x << "\n"

给予

错误:预期为 ';'字符串常量之前

同时

#define PRINT(x) std::cout << x##" = " << x << "\n"

给予

错误:粘贴“1”和“”=“”没有给出有效的预处理令牌

请问,我怎样才能实现我的目标?谢谢!

【问题讨论】:

    标签: c++ c macros


    【解决方案1】:

    在宏参数前使用单个# 将其转换为字符串。

    还要在参数的正常用法周围加上括号,以防止运算符优先级的意外影响。

    #define PRINT(x) std::cout << #x " = " << (x) << "\n"
                                  ^           ^ ^
    

    您不希望在此处连接令牌(或在您链接到的问题中,如那里的答案所述);这不用于组合字符串文字(这是自动完成的),而是将两个标记组合在一起以形成一个标记,例如

    #define DECLARE_TWO_VARIABLES(x) int x ## 1, x ## 2;
    DECLARE_TWO_VARIABLES(stuff)
    

    扩展到

    int stuff1, stuff2;
    

    12 连接到参数stuff 以创建单个标记stuff1stuff2

    【讨论】:

      猜你喜欢
      • 2017-08-18
      • 1970-01-01
      • 2010-12-08
      • 2011-04-07
      • 1970-01-01
      • 2015-02-03
      相关资源
      最近更新 更多