/std
(指定語言標準版本)
從指定的 C 和 C++ 語言標準版本啟用支援的 C 和 C++ 語言功能。
語法
/std:c++14
/std:c++17
/std:c++20
/std:c++latest
/std:c11
/std:c17
/std:clatest
備註
Visual Studio 2017 和更新版本中提供 /std
選項。 它們可用來控制程式碼編譯期間所啟用的版本特定 ISO C 或 C++ 程式設計語言標準功能。 這些選項可讓您停用對某些新語言和程式庫功能的支援:這些功能可能會破壞符合特定版本語言標準的現有程式碼。
Visual Studio 2017 和更新版本中的 Microsoft C++ 編譯器不支援 C++14 (/std:c++14
) 之前的 C++ 標準模式。 未規劃這類支援。 作為一種不完美的暫時解決方法,可以使用未實作後來標準中的功能的舊版 Visual C++ 編譯器工具組。 如需如何在 Visual Studio 中安裝和使用舊版編譯器工具組的詳細資訊,請參閱在 Visual Studio 中使用原生多重目標來建置舊專案 (英文)。
C++ 標準支援
可以使用 _MSVC_LANG
前置處理器巨集來偵測 C++ 編譯期間生效的 /std
選項。 如需詳細資訊,請參閱 前置處理器巨集。
重要
由於某些現有程式碼取決於巨集 __cplusplus
的值為 199711L
,因此 MSVC 編譯器不會變更此巨集的值,除非您透過設定 /Zc:__cplusplus
明確選擇加入。 指定 /Zc:__cplusplus
和 /std
選項,以將 __cplusplus
設定為適當的值。
/std:c++14
/std:c++14
選項會啟用 MSVC 編譯器所實作的 C++14 標準特定功能。 此選項是編譯為 C++ 的程式碼的預設選項。 從 Visual Studio 2015 Update 3 開始提供。
此選項會停用編譯器和標準程式庫對語言標準最新版本中已變更或新增功能的支援。 不過,它不會停用已在舊版 MSVC 編譯程式中實作的一些 C++17 功能。 如需詳細資訊,請參閱 Microsoft C/C++ 語言一致性。 這些表格會指出在您指定 /std:c++14
時啟用了哪些 C++17 功能。
當指定 /std:c++14
選項時,下列功能會保持啟用,以避免對已依賴 Visual Studio 2015 Update 2 中或之前的功能的使用者進行中斷性變更:
/std:c++17
/std:c++17
選項會啟用 C++17 標準特定功能和行為。 它會啟用 MSVC 編譯器所實作的完整 C++17 功能集。 此選項會停用編譯器和標準程式庫對 C++17 之後新增或變更的功能的支援。 它會特別停用 C++ 標準與工作草稿版本中的 C++17 後的變更。 它不會停用 C++ 標準的追溯缺陷更新。 此選項可從 Visual Studio 2017 15.3 版開始使用。
根據 MSVC 編譯器版本或更新層級,當您指定 /std:c++17
選項時,C++17 功能可能無法完全實作或完全符合。 有關 Visual C++ 中按發行版本劃分的 C++ 語言一致性的概述,請參閱 Microsoft C/C++ 語言一致性。
/std:c++20
/std:c++20
選項會啟用 C++20 標準特定功能和行為。 從 Visual Studio 2019 16.11 版開始,它可啟用 MSVC 編譯程式實作的完整C++20 功能集。 請注意,Visual Studio 2022 17.0 版不支援 std::format
、C++20 <chrono>
格式延伸模組,以及以下範圍處理站和範圍配接器<ranges>
/std:c++20
,因為標準版發行后立即變更這些功能的後期中斷。
/std:c++20
選項會停用編譯器和標準程式庫對 C++20 之後新增或變更的功能的支援。 它會特別停用 C++ 標準與工作草稿版本中的 C++20 後的變更。 它不會停用 C++ 標準的追溯缺陷更新。
選項/std:c++20
會啟用 所提供的/permissive-
標準一致性模式,除非使用 明確覆寫。/permissive
/std:c++latest
/std:c++latest
選項會啟用針對下一個草稿標準提出的所有目前實作編譯器和標準程式庫功能,以及一些進行中和實驗性的功能。 此選項可從 Visual Studio 2015 Update 3 開始提供。
根據 MSVC 編譯器版本或更新層級,當您指定 /std:c++latest
選項時,C++17、C++20 或建議的 C++23 功能可能無法完全實作或完全符合。 建議您使用最新版本的 Visual Studio,以達到最高標準一致性。 有關 Visual C++ 中按發行版本劃分的 C++ 語言和程式庫一致性的概述,請參閱 Microsoft C/C++ 語言一致性。
在 16.11 版之前的 Visual Studio 2019 版本中,需要 /std:c++latest
才能啟用 C++20 的所有編譯器和標準程式庫功能。
自 Visual Studio 2019 16.8 版以來,/std:c++latest
除非使用 明確覆/permissive
寫 ,否則此選項已啟用 所提供的/permissive-
標準一致性模式。
如需支援的語言和程式庫功能清單,請參閱 Visual Studio 中 C++ 的新功能。
/std:c++latest
選項不會啟用 /experimental
參數所保護的功能,但可能需要啟用它們。
注意
/std:c++latest
所啟用的編譯器和程式庫功能可能會出現在未來的 C++ 標準中。 未核准的功能會是中斷性變更或移除的項目 (恕不另行通知),並且會以不變更原狀的基礎來提供。
C 標準支援
您可以使用 /TC
或 /Tc
編譯器選項來叫用 Microsoft C 編譯器。 預設會針對副檔名為 .c
的程式碼使用,除非由 /TP
或 /Tp
選項覆寫。 預設的 C 編譯器 (也就是未指定 /std:c11
或 /std:c17
時的編譯器) 會實作 ANSI C89,但包含數個 Microsoft 擴充功能,其中有些是 ISO C99 的一部分。 您可以使用 /Za
編譯器選項來停用 C89 的一些 Microsoft 擴充功能,但其他擴充功能仍然有效。 無法指定嚴格的 C89 一致性。 此編譯器不會實作 C99 的數個必要功能,因此也無法指定 C99 一致性。
/std:c11
/std:c11
選項會啟用 ISO C11 一致性。 從 Visual Studio 2019 16.8 版開始提供。
/std:c17
/std:c17
選項會啟用 ISO C17 一致性。 從 Visual Studio 2019 16.8 版開始提供。
由於需要新的前置處理器來支援這些標準,因此 /std:c11
和 /std:c17
編譯器選項會自動設定 /Zc:preprocessor
選項。 如果您想要使用 C11 或 C17 的傳統 (舊版) 前置處理器,您必須明確設定 /Zc:preprocessor-
編譯器選項。 設定 /Zc:preprocessor-
選項可能會導致非預期的行為,不建議這麼做。
注意
在 Visual Studio 2019 版本 16.10 版發行時和期間,Visual Studio 安裝的 Windows SDK 和 UCRT 程式庫尚不支援 C11 和 C17 程式碼。 需要更新版本的 Windows SDK 和 UCRT。 如需詳細資訊和安裝指示,請參閱在 Visual Studio 中安裝 C11 和 C17 支援 (英文)。
當您指定 /std:c11
或 /std:c17
時,MSVC 支援標準所需的所有 C11 和 C17 功能。 /std:c11
和 /std:c17
編譯器選項可啟用對這些功能的支援:
_Noreturn
和 <stdnoreturn.h>_Alignas
、_Alignof
和 <stdalign.h>_Generic
和 <tgmath.h>
當您的來源檔案具有 .c
副檔名時,或是當您指定 /TC
或 /Tc
編譯器選項時,IDE 會使用 C 設定來進行 IntelliSense 和程式碼醒目提示。 目前,C 中的 IntelliSense 會醒目提示關鍵字 _Alignas
、_Alignof
、_Noreturn
和 _Static_assert
,但不會醒目顯示標準標頭中定義的對等巨集:alignas
、alignof
、noreturn
和 static_assert
。
由於 C17 主要是 ISO C11 的錯誤修正版本,因此 MSVC 對 C11 的支援已經包括所有相關的缺陷報告。 C11 和 C17 版本之間沒有差異,但 __STDC_VERSION__
巨集除外。 對於 C11,它會擴充為 201112L
,而對於 C17,它會擴充為 201710L
。
此編譯器不支援 ISO C11 的大部分選擇性功能。 C11 的這些選用功能中有幾個是 C99 必要的功能,但由於架構原因,MSVC 尚未實作。 您可以使用功能測試巨集 (例如 __STDC_NO_VLA__
) 來偵測個別功能的編譯器支援層級。 如需 C 特定預先定義巨集的詳細資訊,請參閱預先定義的巨集。
沒有一致的多執行緒、不可部分完成或複數支援。
因為 Windows 堆積實作,因此缺少
aligned_alloc
支援。 替代方法是使用_aligned_malloc
。缺陷報告 400 支援目前未針對
realloc
進行實作,因為此變更會破壞 ABI。未計劃支援可變長度陣列 (VLA)。 VLA 提供與
gets
(其已被棄用並計劃移除) 相當的攻擊向量。
/std:clatest
/std:clatest
選項的行為就像 C++ 編譯器的 /std:c++latest
參數一樣。 該參數可啟用針對下一個 C 標準草稿提出的所有目前實作編譯器和標準程式庫功能,以及一些進行中和實驗性的功能。
如需詳細資訊,請參閱 Microsoft C/C++ 語言一致性的 C 標準程式庫功能一節。
在 Visual Studio 開發環境中設定這個編譯器選項
開啟專案的 [屬性頁] 對話方塊。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性。
選取 [組態屬性]>[C/C++]>[語言] 屬性頁。
在 C++ 語言標準 (或對於 C,則為 C 語言標準) 中,從下拉式控制項中選擇要支援的語言標準,然後選擇 [確定] 或 [套用] 以儲存變更。