wchar and stdout in VC11

wchar and stdout in VC11

本文关键字:VC11 in stdout and wchar      更新时间:2023-10-16

我在Visual Studio 2012中发现了一个输出宽字符的奇怪问题,我已将其缩小到以下代码中。

#include <cstdio>
int main()
{
fputws(L"Hello Worldn", stdout); // Throws Access Violation exception
}

当使用Visual C++2012编译此文件时,它会在fputws内部的某个位置抛出一个"未处理的异常",即"读取位置0x00000064的访问冲突"。

我用来编译的是CLI版本,只是为了排除IDE中的任何设置。我正在打开Visual Studio命令提示符并使用以下命令:

cl test.cpp

当使用Visual Studio 2008或Visual Studio 2010时,它运行良好,可以写出"Hello World"。

但在使用Visual Studio 2012时,它会因上述错误而崩溃。

我很难相信这是一个编译器问题,而是不同版本的C++之间发生了变化。

另一件(有趣的)事情是,如果我先输出一个普通的char,就像下面的代码片段一样,它工作得很好。所以我认为这是未初始化流的问题?

#include <cstdio>
int main()
{
fputs("", stdout);
fputws(L"Hello Worldn", stdout); // Now this works.
}

有人有什么想法吗?

编辑:

以下类似的功能在VS2012中运行良好:

std::wcout << L"Hello world" << std::endl;
wprintf(L"Hello worldn");
_putws(L"Hellon", stdout);
putwchar(L'H');

编辑2:刚刚向微软提交了一份错误报告。

我在RTM VS2012上遇到了这个问题,但在VS2012更新1上没有。在问题系统上安装更新1后,错误消失。感谢Mats的报道。