【发布时间】: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。
以下是我为解决此问题所采取的步骤。
- 首先我卸载了所有 2010 可再发行组件,包括 VS 2010 本身。
- 通过程序和功能,我运行了 VS 2013 卸载向导并选择了“修复”
- 这解决了我遇到的关于“初始化器列表”无法识别的问题,但是,出现了本书未涵盖的另一个错误。
我得到的错误和解决方案是由于过期而导致的 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