C++17可变参数模板调试函数报stray # in program错误原因查询
C++17可变参数模板调试函数编译错误解决方案
错误根源
你遇到的stray # in program错误属于语法误用,核心问题有两点:
#是C/C++预处理器专属的字符串化运算符,仅能在宏定义上下文里作用于宏参数,模板的函数参数包不属于预处理器处理范畴,编译器在解析模板代码时遇到非宏场景下的#就会抛出该错误。- 即便语法合法,你的写法也无法单独提取每个参数的名字:
args是整个参数包,#args即使放到宏里也只会把整个传入的参数列表转为单个字符串,无法拆分得到每个参数的独立名称。
正确实现方案
要实现你需要的{参数名: 参数值, ...}输出格式,必须结合变参宏(负责提取参数名字符串)和C++17折叠表达式(负责展开多参数处理),参考实现代码如下:
#include <iostream> // 调试函数宏,do while(0)是宏定义常规写法,避免分支语句展开时语法错误 #define deb(...) do { \ std::cout << "{"; \ const char* sep = ""; \ /* 折叠表达式展开每个参数的打印逻辑 */ \ ([&](const auto& arg) { \ std::cout << sep << #arg << ": " << arg; \ sep = ", "; \ }(__VA_ARGS__), ...); \ std::cout << "}\n"; \ } while(0) // 测试用例 int main() { int a = 2, b = 3, c = 4; deb(a, b, c); // 输出 {a: 2, b: 3, c: 4} deb(a); // 输出 {a: 2} return 0; }
内容的提问来源于stack exchange,提问作者Mukul Kadyan
相关产品推荐
相关产品推荐

