如何让编译器接受无L前缀的字符串字面量赋值给std::wstring?
解决std::wstring直接赋值窄字符串字面量的编译问题
问题根源
std::wstring是宽字符字符串类型,要求初始化时使用带L前缀的宽字符字面量;而普通不带前缀的"foo"是窄字符字面量,两者类型不匹配,导致VS2013编译报错。
可行解决方案
针对Swagger Codegen生成的大量无L前缀代码,提供三种解决方式:
1. 修改VS编译器选项(无需修改代码)
VS2013支持关闭严格字符串类型检查,让编译器自动将窄字符串字面量转换为宽字符串:
- 右键项目 → 属性 → 配置属性 → C/C++ → 命令行
- 在「附加选项」中添加:
/Zc:strictStrings- - 点击确定后重新编译即可。
注意:该选项会弱化类型安全检查,可能隐藏部分编码转换问题,仅建议在确定所有窄字符串都是ASCII编码时使用。
2. 全局替换字符串字面量(类型安全,推荐)
利用VS的正则查找替换功能,批量为无L前缀的字符串添加前缀:
- 打开「查找和替换」窗口(Ctrl+Shift+H)
- 勾选「使用正则表达式」
- 查找内容:
(?<!L)"([^"]*)" - 替换内容:
L"$1" - 点击「全部替换」,注意先在小范围代码中测试替换规则,避免误改注释或特殊字符串。
3. 自定义字符串字面量运算符(C++11特性,VS2013支持)
通过自定义字面量运算符,让普通字符串字面量自动转换为std::wstring:
#include <string> #include <codecvt> // 定义自定义字面量,将窄字符串转为宽字符串 std::wstring operator"" _w(const char* str, std::size_t len) { std::wstring_convert<std::codecvt_utf8<wchar_t>> converter; return converter.from_bytes(str); }
之后将生成代码中的"foo"替换为"foo"_w即可。这种方式支持UTF-8编码的窄字符串转宽字符,比直接加L前缀的兼容性更好,但仍需批量修改代码。
内容的提问来源于stack exchange,提问作者Stefan Deller
相关产品推荐
相关产品推荐

