【发布时间】:2012-06-18 17:13:24
【问题描述】:
我的编译器将其扩展为 199711L。那是什么意思?我读到 __cplusplus > 199711L 表示 C++11。这个宏有哪些可能的扩展,它意味着什么?
【问题讨论】:
-
表示当前当前语言版本
标签: c++ preprocessor-directive compiler-version
我的编译器将其扩展为 199711L。那是什么意思?我读到 __cplusplus > 199711L 表示 C++11。这个宏有哪些可能的扩展,它意味着什么?
【问题讨论】:
标签: c++ preprocessor-directive compiler-version
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 年起拥有代码支持标准。
我想要一个助记符定义,这样我就不必再回到这篇文章了。
【讨论】:
#if __cplusplus >。尽管some mysteriously historical issues,请不要复制the bad practice from MS。
这意味着它与 1997 年的 C++ 标准兼容(实际上称为 C++ '98,因为他们花了很长时间才批准它..
【讨论】:
C++20 的__cplusplus 值
根据 Acorn 的回答,__cplusplus 是基于链接cpp.predefined(1.1) 的宏定义为 202002! 这个定义也可以在这个cppreference找到! 搜索 __cplusplus
此后已更新至 202004
要了解其在 Visual Studio 社区 2019 中对 Microsoft Visual 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
【讨论】: