【发布时间】:2018-10-08 23:55:07
【问题描述】:
我从我的一位学生那里收到了一个 C++ 源代码文件,他在 Visual Studio 2017 中创建了该文件,该文件在他的机器上正确编译和链接。作为测试,我也使用 VS2017、Clang v7.0.0、Intel Parallel Studio XE 2019 和 g++(x86_64-posix-seh-rev0,由 MinGW-W64 项目构建)8.1.0 在我的 Windows 10 机器上编译了它。除了 MinGW-W64 之外,它编译得很好,这会产生许多错误和警告,如下所示:
C:\temp>g++.exe -c MyFile.cpp
MyFile.cpp:1:1: error: stray '\377' in program
■# i n c l u d e < i o s t r e a m >
^
MyFile.cpp:1:2: error: stray '\376' in program
■# i n c l u d e < i o s t r e a m >
^
MyFile.cpp:1:3: error: stray '#' in program
■# i n c l u d e < i o s t r e a m >
^
MyFile.cpp:1:4: warning: null character(s) ignored
■# i n c l u d e < i o s t r e a m >
^
MyFile.cpp:1:6: warning: null character(s) ignored
■# i n c l u d e < i o s t r e a m >
^
MyFile.cpp:1:8: warning: null character(s) ignored
■# i n c l u d e < i o s t r e a m >
^
我用十六进制编辑器查看了源代码文件,发现前两个字节的十六进制值分别为 FF 和 EF。之后,每个 ASCII 字节前面都有一个 00 字节。我的第一个猜测是这是一个 Unicode 文件(或类似的文件)。
我的假设是他的 Windows 10 配置或 VS 中的某些设置,或两者兼而有之,导致生成此类文件,可能是默认语言/区域设置选择。因此,我有两个问题:
MinGW-W64 配置中是否有一些设置允许它处理这些类型的文件而不会像 VS、Intel 和 Clang 那样抱怨?如果有,是什么?
如果 Windows 或 VS 中的某些设置导致 VS 编辑器生成这些类型的文件,具体来说,必须更改哪些内容才能仅创建纯 ASCII 文件?
我总是不鼓励学生仅仅因为这样的问题而制作 Unicode 文件,但我也会向他们提供一些信息,告诉他们如何在发生这种情况时避免这样做。我会上传实际的源代码文件,但我在这个网站上找不到方法。
谢谢, 雷
【问题讨论】:
-
虽然更好的答案是停止任何将源文件保存为 UTF-16 的操作,并改用合理的编码,但现在尝试使用
-finput-charset=UTF-16进行编译
标签: c++ visual-studio unicode mingw-w64