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

How to change c++ standard in Visual Studio 2013

本文关键字:c++ 标准 2013 Visual Studio      更新时间:2023-10-16

我一直在关注Bjarne Stroustrup的书的C++编程与原理第二版。

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

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

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

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

虽然OP使用的是VS 2010,但该线程也有相同的问题:如何";激活";visual studio 2010中的c++11标准?

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

在这一点上,我完全迷失了方向,不知道如何修复它。如果没有这个标准,几乎不可能遵循比约恩的书。

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

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

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

  1. 首先,我卸载了所有2010年的可再发行文件,包括VS 2010本身
  2. 通过程序和功能,我运行了VS 2013卸载向导并选择了"修复">
  3. 这解决了我遇到的无法识别"初始值设定项列表"的问题,然而,出现了另一个书中没有涵盖的错误

我得到的错误和解决方案最终是由过期引起的std_lib_facilities.h尽管我直接从书中复制了链接。PDF

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

附言:我没有重新安装2010年的可再发行版,因为我不认为我现在有必要。

在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 1800afaik。

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

Visual Studio不完全支持C++11:VS2013中支持的C++11功能。

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

本标准的未来版本将用更大的值替换此宏的值。不合格的编译器应使用最多包含五位小数的值。

我认为只要Visual Studio不完全符合C++11(如果有的话;),宏就不适合201103L

我相信宏说199711L表示(几乎完全)C++98一致性(尽管我还有C++98的特性没有包括在VS中)。

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

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

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

首先,我卸载了所有2010年的可再发行文件,包括VS 2010本身。通过程序和功能,我运行了VS 2013卸载向导并选择了"修复"。这解决了我遇到的无法识别"初始值设定项列表"的问题,然而,出现了另一个书中没有涵盖的错误。

尽管我直接从书中复制了链接,但我得到的错误和解决方案最终是由过期的std_lib_facilities.h引起的。PDF

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

附言:我没有重新安装2010年的可再发行版,因为我不认为我现在有必要。

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

VS2013支持大多数C++11功能。你会注意到,如果你制作了一个项目和#include <thread>,它对你来说应该很好。

要了解编译器支持C++11的哪些功能,请查看以下内容:C++11核心功能表