如何在C++中定义可打印文件名、函数名、行号的debug调试宏?
多余引号的来源是宏定义里的字符串化操作符#:#a会把你传入的第一个参数整体转为带引号的字符串字面量,比如你传入"test %d",经过#a处理后会变成"\"test %d\"",相当于多套了一层引号,因此输出会带上多余的引号。
直接去掉a前面的#即可解决问题,你的第一个参数本身就是格式字符串,不需要额外做字符串化处理。修改后的宏定义如下:
#include <cstdio> // 兼容标准C/C++的写法 #define debug(format, ...) printf("[%s:%s():%d] " format "\n", __FILE__, __func__, __LINE__, ##__VA_ARGS__)
如果你要保留原有GNU风格的args...写法,只需要去掉#即可:
#include <cstdio> #define debug(a, args...) printf("[%s:%s():%d] " a "\n", __FILE__, __func__ , __LINE__, ##args)
修改后,调用debug("test %d", 1)时,C/C++会自动将相邻的字符串字面量拼接为完整的格式串,最终输出为你需要的[src/main.cpp:main():8] test 1,不会再有多余引号。
内容的提问来源于stack exchange,提问作者progressiveCavemen
相关产品推荐
相关产品推荐

