在mingw 4.7.1上使用stoi和std::to_string函数

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发行版带有这些函数的支持吗?
1个回答

6
Mingw使用Windows API,但Windows没有提供符合要求的vswprintf函数来实现to_string,这应该归咎于Microsoft。如果您使用最新版本的mingw-w64 fork和未发布的4.8版本的GCC,则可以正常工作,但是主要的mingw32和GCC 4.7.1则无法使用。如果您愿意打补丁以尝试在您的实现中解决此问题,可以尝试在http://tehsausage.com/mingw-to-string上提供的解决方案,但请仔细阅读其注意事项。更新:似乎只有std::to_wstring受到破损的vswprintf函数的影响,因此我为GCC 4.9.3(及更高版本)进行了更改,将定义MinGW的std::stoistd::stodstd::to_string等,并保持to_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

你应用了这个补丁吗?请给我提供错误报告或补丁提交的链接,好吗? - Mohamed ElNakeep
1
https://gcc.gnu.org/PR37522 和 https://gcc.gnu.org/r219019,虽然更改测试是一个错误(导致 https://gcc.gnu.org/PR64438),但我已经在 https://gcc.gnu.org/r219146 中撤销了更改。 - Jonathan Wakely

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接