【问题标题】:Is there a standard definition for __cplusplus in c++14?c++14 中 __cplusplus 有标准定义吗?
【发布时间】:2014-11-23 05:18:55
【问题描述】:

我正在寻找设置一些预处理器的东西,我想要一个更准确的数字来说明 C++14 中的 __cplusplus 应该被定义为什么。该标准是否规定了一项?

【问题讨论】:

  • 这就是草稿的重点;预测未来很难。 C++98 的值是 1997 年。
  • clang++ 3.5.0 已经有正确的定义,g++ 4.9.0 没有:coliru.stacked-crooked.com/a/423c4f858358d017
  • 我只用#if __cplusplus > 201103L
  • 如果您想检查特定语言功能而不是语言版本,也许您愿意关注this proposal
  • @PaperBirdMaster,这是一个非常有用的答案。看来 GNU 编译器已经实现了这些定义,我将使用它们来测试特定功能。

标签: c++ c++14


【解决方案1】:

N3936* §16.8 [cpp.predefined]/p1:

1 以下宏名称应由实现定义:

__cplusplus

名称__cplusplus 定义为值201402L 时 编译一个 C++ 翻译单元。

N3936 是成为 C++14 的最终工作草案,编号 201402L 与发出 C++14 标准进行最终投票的会议 (February 2014) 一致。

*有兴趣获得 C++ 标准副本的人应该查看Where do I find the current C or C++ standard documents?

【讨论】:

    【解决方案2】:

    cppreference 在“Predefined macros”部分中包含有关__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 的宏值是多少)。

    库供应商通常在#if __cplusplus > 201703L 上将他们的“C++2a”功能门控,在__cplusplus > 202002L 上门控他们的“C++2b”功能,等等。

    具有“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 if and only if you pass /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 之间的某个时间将 -std:c++latest 模式的宏从 201704L 提升到了 201705L。截至2021年2月,据我所知,MSVC没有正式的“C++20”模式。

    【讨论】:

    • 作为参考,它现在被标准化为 C++20 的 202002L(GCC 10.2.0 和 --std=c++20 报告 201709L,而 Clang 11.0.1 已经使用 202002L) .
    • 仅供参考,Clang 12(截至 2021 年 3 月 3 日在候选版本中)引入了 -std=c++2b__cplusplus == 202101L
    猜你喜欢
    • 2017-02-15
    • 2011-11-23
    • 2021-07-14
    • 2015-09-08
    • 2010-10-16
    • 2011-05-28
    • 2013-12-24
    • 2019-12-07
    相关资源
    最近更新 更多