一、C++标准的历史

  • C++标准初始于1989年,由国际标准化组织(ISO)推动。ISO其实是一个大群国家标准组织,成员机构包括美国的ANSI
  • 下面是C++标准的发展历程:
  • ①C++98:于1998年批准,是第一份C++标准规则
  • 官方名称是Inforamtion Trchnology-Programming Languages-C++,文档编号ISO/IEC 14882:1998
  • ②C++03:这是个所谓“技术勘误”(technical corrigendum,TC),内含不甚严重的C++98 bug修正
  • 文档编号ISO/IEC 14882:2003.不论C++98或C++03都被视为“第一份C++标准规则”
  • ③TR1:内含大幅度的标准库扩充。它所涵盖的扩充全部包含于namespace std::tr1内
  • 官方名称是Information Technology-Programming Languages-technical Report onC++ Library Extensions。文档编号ISO/IEC TR 19768:2007
  • ④C++11:批准于2011年,是第二份C++标准。C++11内含语言和标准库两方面皆十分重要的改善和强化,而TR1所做的扩充也被纳入称为namespace strd的一部分
  • 官方名称又一次是Inforamtion Trchnology-Programming Languages-C++,新的文档编号ISO/IEC 14882:2011
  • C++11这一标准长时间被称为“C++0x”,带着一种“将于2009年前完成”的大众期待,所以不论C++11还是C++0x,其实都是同一份东西,一律称之为C++11
  • ⑤C++17/C++20

二、关于C++11 标准的常见疑问


哪里可以获得这份标准

  • 最近的一份免费的C++11 standard草案,文档名称是N3242。这份草案应该足够满足大多数用户和程序员,但如果你需要真正的标准规格书,必须付费给ISO或某个国属机构



为什么C++11较前一版本之间距离这么久

  • C++11标准化过程花费了10年甚至不止,这是许许多多个人和公司的努力成果,这些努力包括提出改善和扩充建议
  • C++的另一个目标是简化事情,为此C++11引进了许多提案


三、C++98和C++11的兼容性

  • C++11的设计目标之一,是对C++98保持向后兼容
  • 一些注意事项:
  • 但是有一些旧版本的东西在C++11中仍然不可以编译通过:例如变量名无论如何也不可以和新导入的关键词相同
  • 向后兼容仅适用于源码,不保证二进制兼容,因为那会导致问题,特别是当一个原有操作取得一个新式返回类型,因为“基于返回类型而形成的重载”是不被允许的(这适用于某些STL算法及STL容器的某些成员函数)
  • 所以请以C++11编译器重新编译C++98程序的每一份源码,包括用到的所有程序库——通常都会成功。若以C++11编译器产生的二进制码链接C++98编译器产生的二进制码,则可能会失败


相关编译宏

  • 下面是C++11的编译宏,如果你的程序使用的是C++11的语法,那么可以在编译之前加上这个宏

#define __cplusplus 201103L

  • C++98和C++03的宏则是:

#define __cplusplus 199711L

  • 注意:不同的编译器这个宏的值可能不同