在MinGW上的g ++ 4.6.1中不存在std :: stoi

Set*_*gie 32 c++ gcc mingw

我尝试在IdeOne(使用gcc 4.5.1)和我的Linux计算机(使用类似4.6.4)编译这个简单的程序:

#include <string>
#include <iostream>

int main() {
     std::cout << std::stoi("32") << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

它完美地编译并输出32.但是,当我尝试使用MinGW和gcc 4.6.1在我的Windows计算机上编译它时,我收到此错误:

test.cpp: In function 'int main()':
test.cpp:5:19: error: 'stoi' is not a member of 'std'
Run Code Online (Sandbox Code Playgroud)

同样的事情发生在std::stoul等等.std::stoi由于某种原因,MinGW中不存在和家庭吗?我认为MinGW(sh | w)上的gcc与Linux上的行为相同.

DRH*_*DRH 45

这是vswprintfWindows上非标准声明的结果.GNU标准库_GLIBCXX_HAVE_BROKEN_VSWPRINTF在此平台上定义,它反过来禁用您尝试使用的转换函数.您可以在此处阅读有关此问题和宏的更多信息:http://gcc.gnu.org/bugzilla/show_bug.cgi?id = 37522.

如果您愿意修改随MinGW分发的头文件,您可以通过删除第!defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)2754行的宏.../lib/gcc/mingw32/4.6.1/include/c++/bits/basic_string.h并将其添加回第2905行到第2965行(引用的行std::vswprintf)来解决此问题.您将无法使用这些std::to_wstring功能,但许多其他转换功能应该可用.

  • 这个问题也影响了std :: to_string,并且将宏移到这些行下方允许我使用该函数. (6认同)
  • 非常棒,完美无缺.这个黑客必须做,直到他们正确修复它.对我来说似乎很愚蠢,他们实际上会禁用标准库中的某些功能而不是实际修复某些功能,但我猜他们有其原因. (4认同)
  • 如果我能做到这一点并且工作正常,他们为什么不把'#if`向下移几行呢? (3认同)

M.M*_*M.M 5

这是在MinGW-w64中修复的,MinGW-w64是原始MinGW项目的一个分支,实际上对解决这样的错误感兴趣。自g ++ 4.9.2起可能已修复,甚至更早。


注意:对于来这里的人来说,他们已经完成了CodeBlocks的默认安装(旧的破碎的MinGW随附),并且想要升级编译器,请参见以下答案

您可以使用任何版本的MinGW-w64:我使用mingw-builds.org中的自安装程序,而该答案使用TDM-GCC-64。如果要同时进行64位和32位编译,则需要安装并添加2个新的编译器:mingw-w64 64位和mingw-w64 32位。它不支持使用带有-m32-m64切换选项的g ++安装。