本文适用 Visual Studio 2017 以及更高版本
默认情况下,MSVC 使用当前系统的代码页(Code Page)编译源文件,这样在编译字符串字面量的时候就和当前系统的代码页一致。
在编译别人的 CMake 项目的时候,特别是在 Linux 平台下开发的项目,源文件默认使用 UTF-8 编码,如果在源码中出现 Unicode 字符,编译就会报错:
例如编译 nlohmann/json
json\tests\src\unit-class_parser.cpp(1): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
json\tests\src\unit-class_parser.cpp(466): error C2001: 常量中有换行符
json\tests\src\unit-class_parser.cpp(467): error C2001: 常量中有换行符
json\tests\src\unit-class_parser.cpp(779): error C2001: 常量中有换行符
json\tests\src\unit-class_parser.cpp(466): fatal error C1057: 宏扩展中遇到意外的文件结束
使用编译参数 /utf-8
解决这个问题,在 CMakeSettings.json
里添加 CMake 命令参数:
-D CMAKE_CXX_FLAGS=/utf-8
参考资料
Set source and execution character sets to UTF-8
跨平台源码编辑
以上解决了编译问题,编辑源文件的时候需要定义一个 EditorConfig
文件定义项目全局的格式与项目保持一致,例如字符编码、换行和缩进等。
在项目根目录下新建一个名为 .editorconfig
的文本文件,内容如下:
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space