我发现在Visual Studio 2012中输出宽字符时出现了一个奇怪的问题,我将其缩小到以下代码。
#include <cstdio>
int main()
{
fputws(L"Hello World\n", 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 World\n", stdout); // Now this works.
}
有人有任何想法吗?
编辑:
以下类似的功能在VS2012中运行良好:
std::wcout << L"Hello world" << std::endl;
wprintf(L"Hello world\n");
_putws(L"Hello\n", stdout);
putwchar(L'H');
编辑2: 刚刚向微软提交了bug report。
答案 0 :(得分:1)
我在RTM VS2012上遇到此问题,但在VS2012 Update 1上没有。在问题系统上安装Update 1后,错误消失了。感谢Mats报道此事。