GNU C/C++ 宏中的标记串联

Token concatenation in GNU C/C++ macro

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

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"

给予

error: expected ';' before string constant

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

给予

error: pasting "1" and "" = "" does not give a valid preprocessing token

请问我怎样才能达到我的目的?谢谢!

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

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

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

您不想在此处进行标记串联(或者在您 link 提出的问题中,如那里的答案所述);这不用于组合字符串文字(这是自动完成的),而是将两个标记组合在一起形成一个标记,例如

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

扩展到

int stuff1, stuff2;

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