c-stoi和std :: to_string在mingw 4.7.1

参见英文答案 > to_string is not a member of std, says g++ (mingw)                                    12个
好吧,我想将我的C 11程序移植到Windows,但似乎在mingw 4.7.1中没有实现stoi和std :: to_string.我知道它已被问及有一个解决方案来编辑​​一些标题,但在我的mingw版本(4.7.1附带codelite)标题是不同的,没有我必须移动的确切行(可能是因为答案是对于mingw 4.6).

所以我的问题是如何在mingw 4.7上获得这些功能?
是否有任何指南在4.7中的标题中有什么变化,或者它可能会包含在4.8中?

当然有boost :: lexical_cast,但我想保持我的代码不变,所以我正在寻找解决方案如何在mingw中启用这些功能.

也许有一些自定义mingw发行版,它支持这些功能?

解决方法:

Mingw使用Windows API,Windows没有提供用于实现to_string的vswprintf函数的符合版本,责怪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(及更高版本)进行了更改,它将定义std :: stoi,std :: stod,std :: to_string对于MinGW,只留下to_wstring undefined.

如果你想自己编辑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
上一篇:在C项目中使用C库会导致很长的错误列表


下一篇:如何用MinGW编译C std :: thread代码?