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

unj*_*nj2 31 c++ compiler-version preprocessor-directive

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

Jer*_*fin 43

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

对于2003年的标准,委员会(显然)决定保持这一价值不变的变化不大.

对于2011年标准,它需要被定义为201103L,(再次,年份= 2011年,月份= 03)再次意味着委员会批准该标准在2011年3月完成.

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

对于2017标准,它必须定义为201703L(2017年3月).

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

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


ems*_*msr 5

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

#define __cpp_1997 199711L
#define __cpp_2003 __cpp_1997
#define __cpp_2011 201103L
#define __cpp_2014 201402L
#define __cpp_2017 201703L
Run Code Online (Sandbox Code Playgroud)

展望2020年代,我们可能还会再制定三个标准。我毫不怀疑,从1997年开始,许多实现者都将拥有支持标准的代码。

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

  • 什么是SD-6?FrankHB 是对的。而且这也非常令人困惑。人们可能会开始做“#ifdef __cpp_2017”,认为这意味着什么。如果您想要进行脏检查而不记住月份,那么预处理器可以通过将 >= 或 < 与您键入 00 代替月份的数字文字进行比较来实现,或者您也可以除以 100,这样您就只得到那一年。 (2认同)

小智 5

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;
}
Run Code Online (Sandbox Code Playgroud)

代码应显示以下内容:

__cplusplus value for C++20 is: 202004
Run Code Online (Sandbox Code Playgroud)