如何在各种编译器中定义 __cplusplus 指令

How are the __cplusplus directive defined in various compilers?

本文关键字:定义 cplusplus 指令 编译器      更新时间:2023-10-16

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

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 月)。

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

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

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

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

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

展望20世纪20年代,我们可能会再有三项标准。 我毫不怀疑,从1997年开始,许多实现者都会有代码支持标准。

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

C++20 的__cplusplus值

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

此后已更新为202004

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

  • 创建视觉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
这意味着

它与1997年的C++标准兼容(实际上被称为C++'98,因为他们花了太长时间才批准它。