簡體   English   中英

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

[英]How to change c++ standard in Visual Studio 2013

我一直在關注 Bjarne Stroustrup 的書的C++ 編程和原理第二版

我的問題是,在他的書中 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引起的。

我得到的錯誤和解決方案可以在這里找到: 簡單代碼需要幫助 - 沒有構造函數實例匹配參數列表

PS:我沒有重新安裝 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 1800 afaik。

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

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

實際上標准在關於__cplusplus的注釋中說:

本標准的未來版本旨在用更大的值替換此宏的值。 不符合標准的編譯器應使用最多五位十進制數字的值。

我認為只要 Visual Studio 不完全符合 C++11(如果有的話;)),這個宏就不201103L201103L

我相信宏說199711L表示(幾乎完整的)C++98 一致性(盡管我還剩下 C++98 特性,它們沒有包含在 VS 中)。

我正在根據請求添加此答案。 這個答案也可以在 OP 中作為編輯找到。

編輯/解決方案:所以我寫這篇文章的主要原因是在閱讀上面的書時,我遇到了一個問題,即使用初始化列表不是公認的功能。 根據關於這個問題的其他帖子和提供的鏈接,初始化列表顯然是 C++11 的一個特性,所以在我使用上面的代碼之后,我假設我沒有使用 C++11。

下面是我為解決此問題而采取的步驟。

首先,我卸載了所有 2010 可再發行組件,包括 VS 2010 本身。 通過程序和功能,我運行了 VS 2013 卸載向導並選擇了“修復”。 這解決了我遇到的關於“初始化列表”無法識別的問題,但是,還有另一個錯誤彈出,這本書沒有涵蓋。

盡管我直接從書中復制了鏈接,但我得到的錯誤和解決方案最終是由過時的std_lib_facilities.h引起的。

我得到的錯誤和解決方案可以在這里找到:簡單代碼需要幫助 - 沒有構造函數實例匹配參數列表

PS:我沒有重新安裝 2010 可再發行組件,因為我目前不認為我需要它們。

您鏈接的線程的問題是 VS2010 不支持許多 C++11 功能,例如 std::thread (這是操作所需要的)。

VS2013 支持大部分 C++11 特性。 您會注意到,如果您創建一個項目並使用#include <thread>它應該可以正常工作。

要查看您的編譯器支持 C++11 的哪些特性,請查看: C++11 核心特性表

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM