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

MSVC2015编译Qt代码遇C2664错误:字符串字面量转char*失败求助

解决MSVC2015编译时wave_init的const类型不匹配错误

这个问题我之前碰到过好几次,本质是MSVC2015默认启用了更严格的字符串字面量类型检查(对应编译器选项/Zc:strictStrings)。C++标准里明确规定字符串字面量(比如你代码里的"db4")是const char[]类型,不能直接隐式转成char*——但你的wave_init函数参数定义是char* wname,这就直接撞在了MSVC2015的严格检查上。而MinGW默认没开这么严的规则,所以能顺利编译。

给你三个解决方案,按推荐程度排序:

1. 修改wave_init的函数声明(最推荐,符合标准)

从你贴的代码看,wave_init内部只是调用filtlength(wname),根本没修改传入的字符串,完全可以把参数改成const char*:

wave_object wave_init(const char* wname) {
    wave_object obj = NULL;
    int retval;
    retval = 0;
    if (wname != NULL) {
        retval = filtlength(wname);
    }
    // 保留其他原有代码
}

如果filtlength的参数也是char*,记得把它的声明也改成const char*,保持类型一致。

2. 显式强制转换(临时救急,不推荐长期用)

要是你暂时没法改wave_init的源码,可以在调用时用const_cast去掉const限定:

db4 = wave_init(const_cast<char*>("db4"));

⚠️ 划重点:只有你100%确定wave_init内部不会修改传入的字符串时才能这么用,不然会触发未定义行为,搞不好程序会崩溃。

3. 关闭MSVC的严格字符串检查

在Qt Creator里调整MSVC2015的编译选项,关掉/Zc:strictStrings:

  • 打开项目的构建设置(Projects > Build Settings)
  • 找到MSVC2015套件的C++编译器选项
  • 添加编译参数:/Zc:strictStrings-(注意末尾的减号)
    这种方法会降低编译器的检查严格性,可能埋下其他隐患,只建议作为临时过渡方案。

最后提个醒

因为你要用到QWT插件,修改完代码重新编译时,一定要确保Qt Creator用的MSVC2015编译器和QWT的编译环境完全匹配,不然容易出现链接错误。

内容的提问来源于stack exchange,提问作者Fabrizio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:34:41