使用宏来显示宏的字符串化内容
use a macro to show the stringified content of a macro
我正在为 Arduino 编写代码。代码开始变长了,想用一些调试宏,可以在串口上显示一些调试信息。
比如我有一些宏来定义我使用哪些串口:
#define SERIAL_GPS Serial1
#define SERIAL_IRIDIUM Serial2
#define SERIAL_VN100 Serial3
如何编写一个宏来显示我为每个端口使用的端口? IE。一些会在调试串行端口上打印的宏:
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等)我真的很想在板启动时打印出来:我有很多用于单独组件的调试选项,在启动时打印它们的状态将有助于跟踪哪些调试被激活或未激活(即使它们都收集在头文件中,记住它们也无妨关于所有这些的用户)。
#
preprocessor operator 阻止其操作数的扩展。您需要添加一个间接层以便进行扩展:
#define SHOW_VAR_NAME_(x) #x
#define SHOW_VAR_NAME(x) SHOW_VAR_NAME_(x)
此功能由 Boost.Preprocessor 的 BOOST_PP_STRINGIZE
提供,如果您开始大量使用预处理器,我建议您使用它。
我正在为 Arduino 编写代码。代码开始变长了,想用一些调试宏,可以在串口上显示一些调试信息。
比如我有一些宏来定义我使用哪些串口:
#define SERIAL_GPS Serial1
#define SERIAL_IRIDIUM Serial2
#define SERIAL_VN100 Serial3
如何编写一个宏来显示我为每个端口使用的端口? IE。一些会在调试串行端口上打印的宏:
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等)我真的很想在板启动时打印出来:我有很多用于单独组件的调试选项,在启动时打印它们的状态将有助于跟踪哪些调试被激活或未激活(即使它们都收集在头文件中,记住它们也无妨关于所有这些的用户)。
#
preprocessor operator 阻止其操作数的扩展。您需要添加一个间接层以便进行扩展:
#define SHOW_VAR_NAME_(x) #x
#define SHOW_VAR_NAME(x) SHOW_VAR_NAME_(x)
此功能由 Boost.Preprocessor 的 BOOST_PP_STRINGIZE
提供,如果您开始大量使用预处理器,我建议您使用它。