【发布时间】:2017-01-04 09:35:47
【问题描述】:
我很确定 Visual C++ 2015 在这里有一个错误,但我不是 100% 确定。
代码:
// Encoding: UTF-8 with BOM (required by Visual C++).
#include <stdlib.h>
auto main()
-> int
{
auto const s = L""
"???? is not in the Unicode BMP!";
return s[0] > 256? EXIT_SUCCESS : EXIT_FAILURE;
}
g++ 的结果:
[H:\scratchpad\simple_text_io] > g++ --版本 |找到“++” g++ (i686-win32-dwarf-rev1, 由 MinGW-W64 项目构建) 6.2.0 [H:\scratchpad\simple_text_io] > g++ compiler_bug_demo.cpp [H:\scratchpad\simple_text_io] > 运行 进程退出代码 = 0。 [H:\scratchpad\simple_text_io] > _Visual C++ 的结果:
[H:\scratchpad\simple_text_io] > cl /nologo- 2>&1 |找到“++” Microsoft (R) C/C++ 优化编译器版本 19.00.23026 for x86 [H:\scratchpad\simple_text_io] > cl compiler_bug_demo.cpp /Feb compiler_bug_demo.cpp compiler_bug_demo.cpp(8): 警告 C4566: 由通用字符名 '\U00010437' 表示的字符不能在当前代码页中表示 (1252) [H:\scratchpad\simple_text_io] > 运行 b 进程退出代码 = 1。 [H:\scratchpad\simple_text_io] > _是否涉及任何 UB,如果没有,哪个编译器行为正确?
附录:
如果使用小写希腊语 PI“π”(在 BMP 中 是),则两个编译器的行为都不会改变,因此这似乎无关紧要。
【问题讨论】:
-
我正要说“VC++ 是错误的,因为 §2.14.5,第 13 项”,但围绕字符集的规则总是让我感到困惑。
-
VS 2015 update 3 (
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.24213.1 for x86) 编译这个没有错误或警告;我将文件保存在 Emacs 的utf-8-unix编码系统中。你具体有哪个版本的VS? -
@legends2k:问题中的示例列出了版本。
-
它有编译器的版本,是的,但没有 Visual Studio 的版本。更新2、3,或者没有任何更新等
-
哦。我很确定我从未安装过更新 3,因为他们内置了用于窥探的基础设施。这让我非常恼火。但是,每次过去,自 1990 年代初以来,我总是对微软的一些半不诚实的行为感到恼火。我只需要让它散发出来。但无论如何,重要的是编译器版本和构建,而且仅此而已。这包含在较大的版本号中。
标签: c++ visual-c++ g++