簡體   English   中英

c++14 中是否有 __cplusplus 的標准定義?

[英]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模式的宏從201704L201705L 截至 2021 年 2 月,據我所知,MSVC 沒有正式的“C++20”模式。

暫無
暫無

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

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