我正在为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和其他)我真的想在电路板启动时打印:我有很多这样的调试选项对于单独的组件,并在启动时打印它们的状态将有助于跟踪哪些调试被激活(即使它们都被收集在头文件中,记住用户关于所有这些调试也没有什么坏处。)
答案 0 :(得分:4)
#
preprocessor operator阻止了其操作数的扩展。您需要添加一个间接层,以便可以进行扩展:
#define SHOW_VAR_NAME_(x) #x
#define SHOW_VAR_NAME(x) SHOW_VAR_NAME_(x)
此功能由Boost.Preprocessor的BOOST_PP_STRINGIZE
提供,如果您开始大量使用预处理器,我建议使用此功能。