使用宏显示宏的字符串化内容

use a macro to show the stringified content of a macro

本文关键字:字符串 显示      更新时间:2023-10-16

我正在为Arduino编写代码。代码开始变长,所以我想使用一些调试宏,并能够在串行端口上显示一些调试信息。

例如,我有一些宏来定义我使用的串行端口:

#define SERIAL_GPS Serial1
#define SERIAL_IRIDIUM Serial2
#define SERIAL_VN100 Serial3

如何编写宏来显示我为每个端口使用的端口? 即一些将在调试串行端口上打印的宏:

Port for GPS: Serial1
Port for Iridium: Serial2
Port for VN100: Serial3

我试过:

#define SHOW_VAR_NAME(x) #x

䋰:

SERIAL_DEBUG.println(SHOW_VAR_NAME(SERIAL_GPS));

但这是在串行上打印的:

SERIAL_GPS

而不是:

Serial1

因为(我猜)宏预处理器只执行一次扫描。有什么聪明的方法可以让它工作吗?

注意:我在这里举一个简单的例子,但是有一些调试变量(例如,一些变量DEBUG_GPS,DEBUG_IRIDIUM等),我真的很想在板启动时打印: 我有很多单独的组件的调试选项,在启动时打印它们的状态将有助于跟踪哪些调试被激活或未激活(即使它们都收集在一个头文件中, 记住所有用户都不会有什么坏处)。

#预处理器运算符可防止其操作数的扩展。您需要添加间接寻址层,以便进行扩展:

#define SHOW_VAR_NAME_(x) #x
#define SHOW_VAR_NAME(x) SHOW_VAR_NAME_(x)

此功能由 Boost.Preprocessor 的BOOST_PP_STRINGIZE提供,如果您开始大量使用预处理器,我建议您使用它。