如何使 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 工具提示注释

使我的 GUI 可以通过键盘访问(Xp、Visual Studio、C++)

如何将 libharu 添加到 Visual Studio