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
相关产品推荐
相关产品推荐

