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

时间:2018-03-12 12:29:10

标签: c++ debugging arduino macros preprocessor

我正在为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和其他)我真的想在电路板启动时打印:我有很多这样的调试选项对于单独的组件,并在启动时打印它们的状态将有助于跟踪哪些调试被激活(即使它们都被收集在头文件中,记住用户关于所有这些调试也没有什么坏处。)

1 个答案:

答案 0 :(得分:4)

# preprocessor operator阻止了其操作数的扩展。您需要添加一个间接层,以便可以进行扩展:

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

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