Visual Studio 2012でワイド文字を出力する際に奇妙な問題が見つかりました。これを、次のコードに絞り込みました。
#include <cstdio>
int main()
{
fputws(L"Hello World\n", stdout); // Throws Access Violation exception
}
これをVisualC++ 2012でコンパイルすると、「未処理の例外」、「アクセス違反の読み取り場所0x00000064」が内部のどこかにスローされfputws
ます。
私がコンパイルに使用しているのは、IDEの設定を除外するためのCLIバージョンです。Visual Studioコマンドプロンプトを開き、次を使用しています。
cl test.cpp
VisualStudio2008またはVisualStudio2010を使用する場合は、「HelloWorld」と書き出すとうまく機能します。
ただし、Visual Studio 2012を使用すると、上記のエラーでクラッシュします。
私はそれがコンパイラの問題であるとは信じがたいですが、C++の異なるバージョン間で変更されたものです。
もう1つの(面白い)ことは、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:マイクロソフトにバグレポートを提出したところです。