在 vs2013 中禁用 c++11 功能

Posted

技术标签:

【中文标题】在 vs2013 中禁用 c++11 功能【英文标题】:disable c++11 features in vs2013 【发布时间】:2014-04-30 11:07:39 【问题描述】:

在 vs 2013 中编写代码时,有没有办法禁用 c++11 功能,我希望我的代码也能在 vs2008 等旧版本上编译。

我厌倦了通过以下方式进行更改: 项目->属性->通用->平台工具集,并更改“Visual Studio 2013 (v120)” 旧的东西,但这是我在下拉菜单中唯一的东西。

【问题讨论】:

为什么不干脆不使用任何 C++11(或更新的)特性? 我是 c++ 新手,我无法判断每个功能是否是 c++11 功能。 那我可以推荐a good reference site吗?它清楚地显示了 C++03、C++11 或 C++14 的特性、类和函数。但是,最好的方法是使用较旧的(没有 C++11 或更高版本的支持)来编译您的程序。 对于 g++/clang,C++98/03 和 C++11 之间存在 ABI 差异,因此链接使用不同 C++ 标准编译的对象是非法的。不知道VS。 为什么不用VS2008? 【参考方案1】:

你不能。

很遗憾,您无法在 Visual Studio 中禁用 C++11 功能并降级到 C++03 或 C++98。可以看看哪些特性属于C++11here和here,尽量不要用。

不过更好的选择是使用旧的 VS 版本,以确保不使用任何新功能。

就我个人而言,我在 Windows 中使用 MinGW/GCC,我可以通过使用编译器开关 -std=c++03-std=c++98 或不使用 -std=c++11 来禁用 C++11。

【讨论】:

【参考方案2】:

如果您安装了其他版本的 Visual Studio,则可以选择较旧的工具集。这可能会有所帮助。

恕我直言,更好的解决方案是设置一个持续集成服务器,为所有受支持的编译器、配置和平台构建代码。一旦你做了一些不受支持的事情,你就会得到构建中断。理想情况下,CI 服务器还会运行您的所有单元测试,以便您还可以查看是否有任何配置破坏了您的测试。

【讨论】:

我将 VS 2008 与 2013 并排安装,并且知道我可以从下拉列表中选择 vs2008。帮助【参考方案3】:

Visual Studio 2015 Update 3 引入了两个新开关(/std:c++14 和 /std:c++latest),让您可以控制要在项目中使用的 C++ 编程语言的版本。在此更新中,如果您指定的语言版本不是其中任何一个,编译器将忽略该开关(带有警告)并默认为 C++14。

见https://blogs.msdn.microsoft.com/vcblog/2016/06/07/standards-version-switches-in-the-compiler/

【讨论】:

【参考方案4】:

要么使用允许显式设置使用标准的编译器(Clang 和 GCC 允许选择标准版本),要么让自己熟悉 C++11 中的更改,以便在代码中避免它们。

如果您需要参考:http://en.cppreference.com/w/ 侧面清楚地显示了在哪个标准版本中引入了某个功能。

【讨论】:

在尝试编写 C++03 代码时,很容易错误地使用 C++11 功能。例如,C++03 中的 std::vector 要求元素为 Copy-Assignable 和 Copy-Constructable,而 C++11 删除了这些限制。所以在某些情况下,说“避免 C++11 特性”与“避免编写错误”一样无用。【参考方案5】:

将 Visual Studio 配置为使用不支持 C++11 功能的其他编译器。 Intellisense 仍将显示 C++11 功能,但您可以在检入本地编译之前发现问题。

How to use GCC with Microsoft Visual Studio?

【讨论】:

以上是关于在 vs2013 中禁用 c++11 功能的主要内容,如果未能解决你的问题,请参考以下文章

如何启用 VS2013 c++ 编译器功能?

VS2013的virtualpath在当前应用程序根的外部

VS2010及2013设置

禁用CPP中部分代码的代码分析(VS 2013)

C++11 线程与异步性能(VS2013)

C++11 VS2013类POD成员初始化