我的编译器将其扩展为 199711L。这意味着什么?我读到 __cplusplus > 199711L 表示 C++11。这个宏有哪些可能的扩展,它意味着什么?
4 回答
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
. 我不记得它被定义为任何有意义的值。
我认为各种版本的预处理器定义应该进入 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 年起拥有代码支持标准。
我想要一个助记符定义,所以我不必一直回到这篇文章。
这意味着它与 1997 C++ 标准兼容(实际上称为 C++ '98,因为他们花了太长时间才批准它。.
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
- 您应该在右侧找到“附加选项”
- 点击“所有选项”。
- 单击“C/C++”将其展开。
单击“应用”按钮,然后单击“确定”按钮
在函数 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