2013-02-07 71 views
3

那麼我想將我的C++ 11程序移植到windows,但似乎在mingw 4.7.1中沒有實現stoi和std :: to_string。我知道它已被問及有解決方案來編輯​​某些標題,但在我的mingw版本(4.7.1附帶codelite)中,標題不同,並且沒有我必須移動的確切行(可能是因爲答案是對於mingw 4.6)。stoi和std :: to_string on mingw 4.7.1

所以我的問題是我怎樣才能得到這些功能4.7? 有什麼指南可以在4.7中修改頭文件,或者將它包含在4.8中?

當然有boost :: lexical_cast,但我想保持我的代碼不變,所以我正在尋找解決方案如何在mingw中啓用這些函數。

也許有一些定製的mingw發行版支持這些功能嗎?

回答

6

Mingw使用Windows API,而Windows不提供vswprintf函數的合規版本,用於實現to_string,這歸咎於微軟。

如果你使用MinGW的-W64叉和未發佈的4.8版本的GCC的(非常)最新版本,然後它會工作,但你的運氣失控與主要的mingw32和GCC 4.7.1

如果你願意修補你的實現,你可以嘗試在http://tehsausage.com/mingw-to-string給出的解決方案,但仔細閱讀注意事項。

更新:

似乎只有std::to_wstring由破vswprintf功能的影響,所以我做了GCC 4.9.3(及更高版本),這將定義std::stoistd::stodstd::to_string變化等MinGW,只是離開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 
+0

你申請這個補丁?你會給我錯誤報告或補丁提交的鏈接嗎? –

+1

https://gcc.gnu.org/PR37522和https://gcc.gnu.org/r219019雖然更改測試是一個錯誤(導致https://gcc.gnu.org/PR64438),並且我恢復了https://gcc.gnu.org/r219146 –

+0

非常感謝 –

相關問題