GNU C/C++ 宏中的标记串联
Token concatenation in GNU C/C++ macro
我希望编写一个宏来输出表达式的文本及其值,例如
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;
将1
和2
连接到参数stuff
以创建stuff1
和stuff2
的单个令牌。
相关文章:
- 使用 Powershell 命令将 cpp 文件的文件夹编译为 GNU 的 g++
- 如何使用 gnu gcc 标志 -mpc32、-mpc64 和 -mpc80?
- 防止 GNU Make 在每次构建时生成 protobuf 代码
- 为什么 C++ 编译器在"c:program filesgnu emacsinclude"中查找包含文件?
- 有没有适用于Windows.lib文件的GNU二进制文件描述符(BFD)
- 监视GNU Radio中的缓冲区
- GNU C++: unique_ptr.h 没有这样的文件或目录
- MinGW在Cygwin上.关于链接GNU科学图书馆的一些问题
- 与libc相比,Gnu科学图书馆的性能较差
- GNU 在看到其他同名文件时重用源文件
- 从 C++ 调用 GNU 绘图,无需用户输入
- 如何为GSL(GNU科学库)调整C++式随机数引擎?
- 没有规则来设定目标'/usr/lib/x86_64-linux-gnu/libboost_filesystem.so'
- 使用 PYbombs 安装软件包 GNU 无线电时出错
- 在编译时使用 gnu++11 过滤值列表,不使用 stdlib(Arduino 环境)
- Java System.loadLibrary 不会在 /usr/lib/x86_64-linux-gnu/ 文件夹中查
- 在Windows中构建GSL(GNU科学库)以与VS2015一起使用
- _mm512_exp_pd与 GNU 编译器一起使用
- GNU Radio中基于条件的输出的块类型
- 如何重建 GNU Arm 嵌入式工具链的 newlib 和 newlib-nano