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

4

我一直在跟随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之外,我没有在网上找到其他解决方案。我的朋友通过parallels在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 我完全迷失了,不知道如何解决。如果没有这个标准,就几乎无法遵循Bjarne的书。
我该如何更改或更新我的C++标准?!
编辑/解决方案:所以我发帖的主要原因是,在遵循上述书籍时,我遇到了使用初始化器列表未被识别为特性的问题。根据其他帖子和提供的链接,初始化器列表显然是C++11的一个特性,所以在使用上述代码之后,我认为我没有使用C++11。
以下是我解决此问题所采取的步骤。
1.首先卸载所有2010年可再发行版本,包括VS 2010本身。 2.通过程序和功能,运行VS 2013卸载向导并选择“修复”。 3.这解决了我遇到的有关“初始化器列表”未被识别的问题,但是出现了另一个错误,该书没有涉及。
我得到的错误和解决方案最终导致了过时的std_lib_facilities.h,尽管我直接从书中复制了链接。
我遇到的错误和解决方案可以在这里找到: 需要帮助的简单代码 - 没有与参数列表匹配的构造函数实例 PS:我还没有重新安装2010年可再发行组件,因为我目前不需要它们。

通常情况下,您可以使用适当的编译器选项来实现,例如 --std=c++11 - πάντα ῥεῖ
1
因为Visual Studio 2013不支持完整的C++11语法(例如constexpr是未定义的,至少没有一些SP的支持),所以使用C++11宏是没有意义的。但是,另一方面,VS2013对C++11拥有完整的库支持(应该有)。 - Creris
在VS上进行版本检查是毫无意义的,因为他们从未增加过__cplusplus版本。请参见此链接。如果您正在使用已安装的最新平台工具集版本,则可以使用该编译器版本支持的所有功能。 - Praetorian
1
@πάνταῥεῖ Visual Studio不支持选择C++语言版本,但是您可以打开或关闭单个功能。 - Mgetz
我解决了我的问题。我编辑了原帖,为将来遇到同样问题的人提供了解决方法。 - Shawn Freeman
你可以把你的修改添加为答案吗?这看起来是其他人可能会遇到的问题,应该将其放入答案中。而且这似乎不是任何已有问题的明显重复。 - Shafik Yaghmour
3个回答

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

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

Visual Studio并不完全支持C++11: VS2013中支持的C++11特性

实际上,标准在关于__cplusplus的一个注释中表示:

此宏的值将被未来版本的标准替换为更大的值。不符合标准的编译器应使用至多五位小数的值。

我认为只要Visual Studio没有完全符合C++11(即使以后可能也不会),该宏就不等于201103L

我相信该宏表示199711L,以指示(几乎完全)符合C++98(尽管VS中仍有一些未包含的C++98特性)。


按照这个逻辑,它也不应该被设置为199711L,因为它们不完全支持C++98,其中2阶段名称查找是不受支持的事情之一。 - Praetorian
如果该宏符合C++11标准,它甚至不应该超过5个数字。我认为其意思更像是“大部分符合C++98标准,但缺少一些重要的C++11特性” ;) - Pixelchemist

1

我是应请求添加这个答案的。此答案也可以在原帖中作为编辑找到。

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

以下是我解决此问题的步骤。

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

由于 std_lib_facilities.h 过时,我得到了一个错误和解决方案,尽管我直接从书中的 .PDF 文件中复制了链接。

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

PS: 自那时起,我没有重新安装2010年的可再发行组件,因为我目前没有需要它们的计划。


0
您链接的线程问题是VS2010不支持许多C++11功能,例如std::thread(这是该操作需要的)。
VS2013支持大多数C++11功能。如果您创建一个项目并#include 它应该可以正常工作。
要查看编译器支持的C++11功能,请查看此内容:C++11 Core Features Table

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接