You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 02:57:01