【问题标题】:How to change c++ standard in Visual Studio 2013如何在 Visual Studio 2013 中更改 c++ 标准
【发布时间】:2015-04-28 13:56:09
【问题描述】:

我一直在关注 Bjarne Stroustrup 的书C++ Programming and Principles 2nd Edition

我的问题是,Bjarne 在他的书中使用了 C++11 标准中的一些函数,使用以下代码,我发现我使用的是 c++98。

if (__cplusplus == 201103L) std::cout << "C++11\n";
else if (__cplusplus == 199711L) std::cout << "C++98\n";
else std::cout << "pre-standard C++\n";

当我发现这一点时,我在一台装有 Win8.1 且平台工具集设置为 v12.0 或更高版本的机器上使用 VS 2013 Ultimate。我的机器上也安装了 VS 2010 和 VS 2015(刚刚安装了 2015 以查看它是否解决了问题)。

这些都不起作用。除了将平台工具集设置为 v12.0 之外,我还没有在网上找到任何其他解决方案。我的朋友通过并行在他的 Mac 上运行 VS 2013 和 2015 没有这个问题。

尽管 OP 使用的是 VS 2010,但该线程也有同样的问题: How to "activate" c++11 standard in visual studio 2010?

这个帖子表明它可能是微软的问题,但仍然没有解决方案:https://connect.microsoft.com/VisualStudio/feedback/details/763051/a-value-of-predefined-macro-cplusplus-is-still-199711l

此时我完全迷失了,不知道如何解决它。如果没有这个标准,几乎不可能遵循 Bjarne 的书。

如何更改或更新我的 C++ 标准?!?!

编辑/解决方案:所以我发表这篇文章的主要原因是在阅读上面的书时,我遇到了一个问题,即使用初始化列表不是一个公认的功能。根据关于这个问题的其他帖子和提供的链接,初始化列表显然是 C++11 的一个特性,所以在我使用上述代码后,我假设我没有使用 C++11。

以下是我为解决此问题所采取的步骤。

  1. 首先我卸载了所有 2010 可再发行组件,包括 VS 2010 本身。
  2. 通过程序和功能,我运行了 VS 2013 卸载向导并选择了“修复”
  3. 这解决了我遇到的关于“初始化器列表”无法识别的问题,但是,出现了本书未涵盖的另一个错误。

我得到的错误和解决方案是由于过期而导致的 std_lib_facilities.h 尽管我直接从书中复制了链接 .PDF

我得到的错误和解决方案可以在这里找到: Simple Code Need Help - no instance of constructor matches argument list

PS:我没有重新安装 2010 可再发行组件,因为我认为我目前不需要它们。

【问题讨论】:

  • 通常您使用适当的编译器选项来执行此操作,例如--std=c++11
  • 这是因为 Visual Studio 2013 没有完整的 C++11 支持(例如 constexpr 完全未定义,至少没有一些 SP),所以只有不使用 C++11 宏才有意义.但另一方面,VS2013 对 C++11 有完整的库支持(应该)
  • 版本检查在 VS 上毫无意义,他们从未增加过 __cplusplus 版本。见this。如果您使用已安装的最新平台工具集版本,则您可以使用该版本编译器支持的所有功能。
  • @πάνταῥεῖ Visual Studio 不支持选择 C++ 版本,但您可以打开和关闭个别功能
  • 我解决了我的问题。我为将来遇到与我所做的相同问题的人编辑了 OP。

标签: c++ visual-studio visual-studio-2013 standard-library


【解决方案1】:

在 Visual Studio 中使用 C++11

您不能在 Visual Studio 中“激活或更改某个 C++ 标准”。 如果您想使用宏进行条件编译,您必须查找您将要使用的功能以及支持它的 Visual Studio 版本。

如果您知道所需的 MSVC 版本,您可以使用类似于

的内容
#if _MSC_VER >= 1800
// ...
#endif

VS2010 有#define _MSC_VER 1600,VS2012 有#define _MSC_VER 1700,VS2013 有#define _MSC_VER 1800 afaik。

如果(部分)支持 C++11,为什么宏不等于 201103L

Visual Studio 不完全支持 C++11:Supported C++11 features in VS2013

实际上标准在关于__cplusplus的注释中说:

本标准的未来版本打算用更大的值替换此宏的值。不符合标准的编译器应使用最多五个十进制数字的值。

只要 Visual Studio 不完全符合 C++11(如果有的话),我认为宏与 201103L 不一样。

我相信宏说 199711L 表示(几乎完全)C++98 一致性(虽然我还有 C++98 未包含在 VS 中的功能)。

【讨论】:

  • 按照这个逻辑,它也不应该设置为 199711L,因为它们不完全支持 C++98,2 阶段名称查找是不支持的东西之一。
  • 如果宏本身符合 C++11,它的位数甚至不应超过 5 位。我认为意思更像是“大部分符合 C++98,但缺少 C++11 的一些重要特性”;)
【解决方案2】:

我根据请求添加此答案。这个答案也可以在 OP 中作为编辑找到。

编辑/解决方案:所以我发表这篇文章的主要原因是在阅读上面的书时,我遇到了一个问题,即使用初始化列表不是一个公认的功能。根据关于这个问题的其他帖子和提供的链接,初始化列表显然是 C++11 的一个特性,所以在我使用上述代码后,我认为我没有使用 C++11。

以下是我为解决此问题所采取的步骤。

首先,我卸载了所有 2010 可再发行组件,包括 VS 2010 本身。通过程序和功能,我运行了 VS 2013 卸载向导并选择了“修复”。这解决了我遇到的关于“初始化列表”无法识别的问题,但是,出现了另一个本书未涵盖的错误。

尽管我直接从书中复制了链接 .PDF

我得到的错误和解决方案可以在这里找到:Simple Code Need Help - no instance of constructor matches argument list

PS:我没有重新安装 2010 可再发行组件,因为我认为我目前不需要它们。

【讨论】:

    【解决方案3】:

    您链接的线程的问题是 VS2010 不支持许多 C++11 功能,例如 std::thread (这是该操作所需要的)。

    VS2013 支持大多数 C++11 功能。您会注意到,如果您创建了一个项目并 #include &lt;thread&gt; 它应该对您很有效。

    要查看您的编译器支持的 C++11 的哪些功能,请查看以下内容:C++11 Core Features Table

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多