如何在Visual Studio 2013中更改c ++标准

时间:2015-04-28 13:56:09

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

我一直关注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终极版。我在我的机器上安装了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. 这解决了我无法识别'初始化列表'的问题,但是,本书还没有出现另一个错误。
  4. 由于过时而导致的错误和解决方案 std_lib_facilities.h 尽管我直接从书中复制了链接.PDF

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

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

3 个答案:

答案 0 :(得分:0)

在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中)。

答案 1 :(得分:0)

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

VS2013支持大多数C ++ 11功能。您会注意到,如果您创建项目并且#include <thread>它应该适合您。

要了解编译器支持的C ++ 11的哪些功能,请查看:C++11 Core Features Table

答案 2 :(得分:0)

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

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

下面是我为解决此问题而采取的步骤。

首先,我卸载了所有2010年可再发行组件,包括VS 2010本身。通过程序和功能,我运行了VS 2013卸载向导并选择了&#39; repair&#39;。这解决了我遇到的问题&#39;初始化列表&#39;但是,没有被识别出来,还有另一个错误,出现了这本书没有涵盖的内容。

由于我直接从书中复制了链接,因此我的错误和解决方案因为过时而导致 std_lib_facilities.h .PDF

我可以在这里找到我得到的错误和解决方案:简单代码需要帮助 - 没有构造函数的实例匹配参数列表

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