如何使 Visual Studio C++ 2010 编译行为像 gcc/g++? (或相反亦然)
Posted
技术标签:
【中文标题】如何使 Visual Studio C++ 2010 编译行为像 gcc/g++? (或相反亦然)【英文标题】:How to Make Visual Studio C++ 2010 Compilation Behave Like gcc/g++? (or vice-versa) 【发布时间】:2011-10-07 15:36:53 【问题描述】:假设你有以下简单的 main.cpp 文件:
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
int main()
const string FILENAME = "foo.txt";
ifstream somefile(FILENAME);
populations.close();
return 0;
这可以通过 Visual Studio C++ 2010 正常编译。
但是,在基于 Linux 的系统上,如果我执行 make main
并编译,我们会收到预期错误,因为我们没有在字符串常量上调用 c_str()
,如下所示:
ifstream somefile(FILENAME.c_str());
众所周知,并在this SO thread 中进行了描述。
如何让 VS 表现得像 gcc/g++ 并为上面的代码引发编译错误?或者,我怎样才能让 gcc/g++ 表现得像 VS 并在没有错误的情况下编译上面的代码? (升级我的gnu编译器是不是很简单?)
(我不认为禁用编译器扩展是一种解决方案,因为我已经这样做了,它仍然可以毫无错误地编译。)
【问题讨论】:
这个问题早在 C++0x 出来之前就被问到了。 为什么不让 gcc 表现得像 VS 一样? @ybakos: 升级 gcc 以获得更新的 libstdc++ ***.com/questions/5060034/… 【参考方案1】:Visual Studio 在这种情况下相对于 C++11 标准 (it works on g++ now, too) 表现正确。我不确定您为什么要这样做,但您可能需要编辑 MSVC 的标头(不建议而且相当激烈)。
奇怪的是,they don't write it in their documentation。你能检查一下实际调用的是哪个构造函数吗?
【讨论】:
它进入:explicit basic_ifstream(const string& _Str, ios_base::openmode _Mode = ios_base::in, int _Prot = (int)ios_base::_Openprot) 感谢 jpalecek 的洞察力。 basic_ifstream下的文档中也没有提到:msdn.microsoft.com/en-us/library/zek0beca(v=VS.100).aspx【参考方案2】:它可作为较新的 c++ 标准的一部分。
要禁用,请添加
#define _HAS_CPP0X 0
在您的包含之前的顶部。
【讨论】:
这确实有效,尽管我认识到使用 gnu 工具包升级可能对我来说更好。以上是关于如何使 Visual Studio C++ 2010 编译行为像 gcc/g++? (或相反亦然)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Visual Studio 中制作可分发的 C++ 程序
Visual Studio C++ Link1104 无法打开文件 MSVCURTD.lib
如何使用 Visual Studio 2005 设置 Google C++ 测试框架 (gtest)
C++ 方法的 Visual Studio 2010 工具提示注释