3

C++11 プログラムを Windows に移植したかったのですが、mingw 4.7.1 には stoi と std::to_string が実装されていないようです。私はそれが尋ねられ、いくつかのヘッダーを編集する解決策があったことを知っていますが、私のmingwバージョン(codeliteに同梱されている4.7.1)ではヘッダーが異なり、移動する必要がある正確な行はありません(おそらく答えがmingw 4.6の場合)。

私の質問は、mingw 4.7でこれらの機能を取得するにはどうすればよいですか? 4.7 でヘッダーを変更するガイドはありますか、それとも 4.8 に含まれる予定ですか?

もちろんboost::lexical_castはありますが、コードはそのままにしておきたいので、mingwでこれらの機能を有効にする方法を探しています。

これらの機能をサポートするカスタム mingw ディストリビューションがあるのではないでしょうか?

4

1 に答える 1

6

Mingw は Windows API を使用しており、Windows はvswprintf実装to_stringに使用される関数の適合バージョンを提供していません。Microsoft のせいです。

(非常に) 最近のバージョンの mingw-w64 フォークとリリースされていない GCC の 4.8 バージョンを使用している場合は動作しますが、メインの mingw32 と GCC 4.7.1 ではうまくいきません。

実装にパッチを当てたい場合は、http://tehsausage.com/mingw-to-stringにある解決策を試すことができますが、注意事項をよく読んでください。

アップデート:

のみstd::to_wstringが壊れたvswprintf関数の影響を受けるようです。そのため、GCC 4.9.3 (およびそれ以降のバージョン) に変更を加え、MinGW の 、 などを定義し、未定義のままにしstd::stoiます。std::stodstd::to_stringto_wstring

4.7.1 ヘッダーを自分で編集する場合は、関連するパッチを次に示します。

--- a/home/jwakely/gcc/4.7.1/include/c++/4.7.1/bits/basic_string.h
+++ b/home/jwakely/gcc/4.7.1/include/c++/4.7.1/bits/basic_string.h.fix
@@ -2808,8 +2808,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace

-#if (defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(_GLIBCXX_USE_C99) \
-     && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))
+#if (defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(_GLIBCXX_USE_C99)

 #include <ext/string_conversions.h>

@@ -2959,6 +2958,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   stold(const wstring& __str, size_t* __idx = 0)
   { return __gnu_cxx::__stoa(&std::wcstold, "stold", __str.c_str(), __idx); }

+#ifndef _GLIBCXX_HAVE_BROKEN_VSWPRINTF
   // DR 1261.
   inline wstring
   to_wstring(int __val)
@@ -3021,6 +3021,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                                            L"%Lf", __val);
   }
 #endif
+#endif

 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace
于 2013-02-07T21:46:30.580 に答える