GNU C/C++宏中的令牌连接

Gnu*_*bie 1 c c++ macros

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

int a = 2;
PRINT(a + 1);
Run Code Online (Sandbox Code Playgroud)

应该输出

a + 1 = 3

C/C++宏字符串连接显示了令牌连接的使用.然而,

#define PRINT(x) std::cout << x " = " << x << "\n"
Run Code Online (Sandbox Code Playgroud)

要么

#define PRINT(x) std::cout << (x) " = " << x << "\n"
Run Code Online (Sandbox Code Playgroud)

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

#define PRINT(x) std::cout << x##" = " << x << "\n"
Run Code Online (Sandbox Code Playgroud)

错误:粘贴"1"和""=""不提供有效的预处理令牌

我怎么能实现我的目标呢?谢谢!

Mik*_*our 5

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

还要将括号括在参数的正常使用周围,以防止操作符优先级的惊人效果.

#define PRINT(x) std::cout << #x " = " << (x) << "\n"
                              ^           ^ ^
Run Code Online (Sandbox Code Playgroud)

你不希望在这里(或在你链接的问题中,如其中所描述的答案)进行标记连接; 这不是用来组合字符串文字(这是自动完成的),而是将两个标记组合在一起制作一个标记,例如

#define DECLARE_TWO_VARIABLES(x) int x ## 1, x ## 2;
DECLARE_TWO_VARIABLES(stuff)
Run Code Online (Sandbox Code Playgroud)

扩展到

int stuff1, stuff2;
Run Code Online (Sandbox Code Playgroud)

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