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

时间:2012-06-15 15:40:30

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

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

5 个答案:

答案 0 :(得分:42)

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

我认为各种版本的预处理器定义应该进入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年开始,许多实现者将拥有支持标准的代码。

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

答案 3 :(得分:1)

C++20 的__cplusplus 值

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

此后已更新至 2004 年

要了解其在 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

答案 4 :(得分:0)

为了回答问题的标题,让我为您介绍一些典型的编译器。如果您保留编译器标志的默认设置,那么将选择以下C ++标准版本:

https://gist.github.com/ax3l/53db9fa8a4f4c21ecc5c4100c0d93c94