46

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

4

4 回答 4

61

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. 我不记得它被定义为任何有意义的值。

于 2012-06-15T15:45:49.507 回答
11

我认为各种版本的预处理器定义应该进入 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 年起拥有代码支持标准。

我想要一个助记符定义,所以我不必一直回到这篇文章。

于 2018-05-18T19:44:06.350 回答
3

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

于 2012-06-15T15:46:59.053 回答
2

C++20 的 __cplusplus 值

根据 Acorn 的回答 __cplusplus 是宏定义为 202002 基于链接cpp.predefined(1.1)!这个定义也可以在这个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
于 2021-06-23T06:07:37.493 回答