预处理器宏DEBUG_PRINT输出异常,请求解决多余0问题
问题分析与解决方案
这个多余的0是因为格式符和millis()的返回类型不匹配导致的参数解析错位,具体拆解如下:
问题根源
你的millis()函数几乎肯定返回的是unsigned long(或者uint32_t这类无符号长整型),但你在宏里用了%d——这个格式符是用来打印有符号整型int的。当printf解析参数时,因为类型大小/格式不匹配,会错误地拆分millis()的返回值:比如如果unsigned long是8字节、int是4字节,printf会把millis()返回值的高位4字节当成你自定义format里第一个%d对应的参数,进而导致输出序列整体错位,出现多余的0。修复方案
把宏里的%7d改成对应millis()返回类型的格式符:
- 如果
millis()返回unsigned long,用%7lu - 如果返回
uint32_t,用%7u(%7lu也兼容) - 如果是64位的
uint64_t,用%7llu
修改后的宏定义:
#define DEBUG_PRINT(tag, format, ...) printf("[%10s] %7lu: " format "\n", tag, millis(), ##__VA_ARGS__)
- 验证
修改后执行你的测试代码:
DEBUG_PRINT("SETUP", "%d %d %d %d", 1, 2, 3, 4);
就能得到预期输出:[ SETUP] 0: 1 2 3 4
补充说明:你之前的DEBUG_PRINT1宏正常工作,是因为它没有引入millis()这个类型不匹配的参数,不存在参数解析错位的问题。
内容的提问来源于stack exchange,提问作者Joel Santos Rico
相关产品推荐
相关产品推荐

