【问题标题】:How are the __cplusplus directive defined in various compilers?__cplusplus 指令在各种编译器中是如何定义的?
【发布时间】:2012-06-18 17:13:24
【问题描述】:

我的编译器将其扩展为 199711L。那是什么意思?我读到 __cplusplus > 199711L 表示 C++11。这个宏有哪些可能的扩展,它意味着什么?

【问题讨论】:

  • 表示当前当前语言版本

标签: c++ preprocessor-directive compiler-version


【解决方案1】:

199711L 代表 Year=1997,Month = 11(即 1997 年 11 月)- 委员会批准标准的日期,ISO 其他成员在 1998 年初批准。

对于 2003 年标准,委员会(显然)决定保持该值不变。

对于 2011 年标准,需要将其定义为 201103L,(同样,年 = 2011,月 = 03)再次表示委员会批准该标准于 2011 年 3 月完成。

对于 2014 年标准,它需要定义为 201402L,解释方式与上述相同(2014 年 2 月)。

对于 2017 标准,要求定义为 201703L(2017 年 3 月)。

对于 2020 年标准,该值已更新为 202002L(2020 年 2 月)。

在原始标准被批准之前,很多编译器通常将其定义为0(或只是一个空定义,如#define __cplusplus)以表示“不符合”。当被问及最严格的一致性时,许多人将其定义为1

我差点忘了提,但还有一个关于古代编译器的花絮:一些最早的 cfront 版本(可能还有一些其他版本的复制器)定义了 c_plusplus 而不是 __cplusplus。我不记得它被定义为任何有意义的值。

【讨论】:

  • 2003 年是“技术修订版”,而不是真正的标准。它只是引入了从未成为标准一部分的“TR3”材料。
  • @MichaelJ:"ISO/IEC JTC1/SC22/WG21 has produced the standard ISO/IEC 14882:2003 on the programming language C++. It was published 2003-10-16."。请注意,这是 TC(技术勘误)而不是 TR(技术报告)的结果。 TR 是一个单独的文件,而不是对标准的修订。
  • 我没有说它是TR,我说它引入了TR3材料,它确实做到了。 2003 年发布的文件是 1998 年标准加上 CA。它不是新的 C++ 标准,1998 年的标准也没有以任何方式进行修改。
  • @MichaelJ:甚至从来没有 TR3。 (奇怪的是)有两个单独的文件,都称为“TR1”。很有可能很快就会有 TR2(他们正在为它收集材料,但暂时停下来专注于完成标准)。我之前评论中的第一句话是委员会网页上直接复制粘贴的引文(如果您愿意点击它并阅读,您就会知道)。
  • 现在,如果有人必须在 ISO C++ 标准委员会说“ISO 14882:2003 是一个标准”和@MichaelJ 说“C++ 没有 2003 标准”之间做出选择,你认为谁 任何理性的人都应该相信?
【解决方案2】:

我认为各种版本的预处理器定义应该进入 SD-6:

#define __cpp_1997 199711L
#define __cpp_2003 __cpp_1997
#define __cpp_2011 201103L
#define __cpp_2014 201402L
#define __cpp_2017 201703L

展望 2020 年代,我们可能会有另外三个标准。我不怀疑许多实现者将从 1997 年起拥有代码支持标准。

我想要一个助记符定义,这样我就不必再回到这篇文章了。

【讨论】:

  • 随意使用#if __cplusplus >。尽管some mysteriously historical issues,请不要复制the bad practice from MS
  • 什么是 SD-6? FrankHB 是对的。而且它也非常令人困惑。人们可能会开始做“#ifdef __cpp_2017”,认为这意味着什么。如果您想在不记住月份的情况下进行脏检查,那么预处理器可以通过将 >= 或
【解决方案3】:

这意味着它与 1997 年的 C++ 标准兼容(实际上称为 C++ '98,因为他们花了很长时间才批准它..

【讨论】:

    【解决方案4】:

    C++20 的__cplusplus 值

    根据 Acorn 的回答,__cplusplus 是基于链接cpp.predefined(1.1) 的宏定义为 202002! 这个定义也可以在这个cppreference找到! 搜索 __cplusplus

    此后已更新至 202004

    要了解其在 Visual Studio 社区 2019 中对 Microsoft Visual C++ 的实际价值,请执行以下操作:

    • 创建 Visual C++ 项目
    • 鼠标右键单击解决方案。
    • 在下拉菜单中点击底部的属性
    • 打开一个弹出对话框
    • 单击“配置属性”将其展开
      • 单击“C/C++”将其展开。
        • 单击“所有选项”。
          • 您应该在右侧找到“附加选项”
            • 在此粘贴的相邻右列: /std:c++latest /Zc:__cplusplus

    点击“应用”按钮,然后点击“确定”按钮

    在main()函数中运行以下代码获取__cplusplus的值

    int main()
    {
        long cppVer = __cplusplus;
        std::cout << "__cplusplus value for C++20 is: ";
        std::cout << std::to_string( cppVer ) << std::endl;
    }
    

    代码应显示如下:

    __cplusplus value for C++20 is: 202004
    

    【讨论】:

    • 感谢您的贡献!有两个问题,但你没有回答这个问题:它意味着什么?
    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 2010-11-28
    • 2019-11-06
    • 2023-03-23
    • 2017-06-26
    • 1970-01-01
    相关资源
    最近更新 更多