[英]Is there a standard definition for __cplusplus in c++14?
我正在尋找設置一些預處理器的東西,我想要一個更准確的數字來說明 C++14 中的__cplusplus
應該被定義為什么。 標准中是否有強制要求?
N3936 * §16.8 [cpp.predefined]/p1:
1 以下宏名稱應由實現定義:
__cplusplus
在編譯 C++ 翻譯單元時,名稱
__cplusplus
被定義為值201402L
。
N3936 是成為 C++14 的最終工作草案,編號201402L
與 C++14 標准發出進行最終投票的會議( 2014 年 2 月)一致。
* 有興趣獲得 C++ 標准副本的人應該查看我在哪里可以找到當前的 C 或 C++ 標准文檔?
cppreference 在“ 預定義宏”部分中提供了有關__cplusplus
宏的標准值的信息。 目前的標准值為:
199711L
(C++98 或 C++03)
201103L
(C++11)
201402L
(C++14)
201703L
(C++17)
202002L
(C++20)
在最終標准發布之前,任何給定版本的宏的價值都不會牢固確立。 因此,截至 2019 年 6 月,無法知道 C++2a 的宏值是多少(截至 2021 年 2 月,無法知道 C++2b 的值是多少)。
庫供應商通常柵極他們的“C ++ 2A”功能上#if __cplusplus > 201703L
,並在他們的“C ++ 2B”設有__cplusplus > 202002L
,等等。
具有“C++2a”模式的編譯器供應商只需為__cplusplus
選擇任意值,使庫供應商的檢查滿意:
GCC (8.x 到 10.x) -std=c++2a
模式使用__cplusplus == 201709L
。
Clang (5.x 到 9.x) -std=c++2a
模式使用__cplusplus == 201707L
。
Microsoft Visual Studio(19.20 至 19.28) /std:c++latest
模式使用__cplusplus == 201705L
當且僅當您通過/Zc:__cplusplus
! 否則它使用199711L
。 所以要注意這一點!
歷史上如何處理轉換?:
Clang 4.0.1 -std=c++1z
設置__cplusplus == 201406L
。 Clang 5.0.0 引入了-std=c++17
和-std=c++2a
,使-std=c++1z
成為-std=c++17
的同義詞,並撞上了宏(無論17
/ 1z
您使用)到標准值201703L
。 Clang 10.0 引入了-std=c++20
,使-std=c++2a
成為-std=c++20
的同義詞,並將宏提升到標准值202002L
。 截至 2021 年 2 月,Clang 沒有正式的“C++2b”模式。
GCC 5.1 引入了-std=c++1z
和-std=c++17
作為同義詞,設置__cplusplus == 201500L
。 GCC 7.1 將該值(無論您使用哪種拼寫)提高到201703L
的標准值。 GCC 8.1 引入了-std=c++2a
和__cplusplus == 201709L
。 GCC 10.1 引入-std=c++20
作為-std=c++2a
的同義詞(但將宏保留在201709L
)。 截至 2021 年 2 月,GCC 主干引入了-std=c++2b
和__cplusplus == 202100L
。
奇怪的是,根據 Godbolt Compiler Explorer 的說法,MSVC 在 MSVC 19.16 和 19.20 之間的201704L
將-std:c++latest
模式的宏從201704L
到201705L
。 截至 2021 年 2 月,據我所知,MSVC 沒有正式的“C++20”模式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.