我的编译器将其扩展为199711L。那是什么意思?我读到__cplusplus> 199711L表示C ++ 11。这个宏有什么可能的扩展以及它意味着什么?
答案 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++ 的实际价值,请执行以下操作:
点击“应用”按钮,然后点击“确定”按钮
在函数 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