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

Token concatenation in GNU C/C++ macro

本文关键字:C++ GNU      更新时间:2023-10-16

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

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

应该输出

a + 1 = 3

C/C++ 宏字符串串联显示了标记串联的使用。然而

#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"和"="未提供有效的预处理令牌

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

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

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

#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的单个令牌。