MISRA C++:2023®——MISRA C++标准的下一个版本来了!为了帮助您更好地了解新版本,Perforce带来了Perforce首席技术支持工程师Frank van den Beuken博士撰写的MISRA C++:2023系列博客的第二篇。阅读第一篇请点击……
正因为如此,它在汽车行业等注重安全的应用领域很受欢迎,MISRA是汽车行业最常用的编码标准之一。
C++是由丹麦计算机科学家Bjarne Stroustrup于1979年在AT&T贝尔实验室发明。它源于对UNIX内核的分析,目的是研究它可以在网络上分布到什么程度。
当Stroustrup在剑桥大学计算实验室撰写博士论文时,对Simula编程语言的程序组织和并发功能印象深刻,并用它编写了一个模拟器。然而,他发现该语言的实现并不能很好地扩展,因此最终用BCPL重写了该模拟器。在AT&T贝尔实验室工作期间,Stroustrup决定用他在Simula中发现的那些有用的语言特性来增强C编程语言。他开始编写一个前处理器Cpre,将带有类似Simula类的C程序转换为可以用现有编译器编译的普通C代码。这种新语言最初被简单地命名为 "带类的C语言"。
从一开始,这个新语言的目标就是可以用于C语言能用于的一切,因此它是一种通用的编程语言。此外,由于C语言编译器已经可以在许多平台上使用,因此它继承了C语言的可移植性,这也是其重要的质量特性之一。该语言的另一个目标是为C语言的不安全特性提供更好的替代方案,同时保持其效率和对底层硬件特性的直接访问。
类
派生类
公共/私有访问控制
构造函数和析构函数
调用和返回功能(由于不受欢迎,很快被删除)
友元类
函数参数的类型检查
内联函数
默认参数
赋值运算符的重载
在C++发展历史的这一时刻,这门语言需要一个合适的名字。有一段时间它被称为C84,但人们认为这个名字难听且容易混淆。最终,计算机科学家Rick Mascitti建议将其命名为 C++,这可以理解为该语言是C语言的继承者。
虚拟功能
函数名称和运算符重载
引用
常量
用户对自由存储器(堆内存)的控制
改进了类型检查和C++风格注释(实际上取自BCPL)
C++语言的第二个版本于1989年完成,提高了其定义和实现的稳定性。
多重继承
类型安全链接
改进了重载函数的解析
赋值和初始化的递归定义
改进的用户定义内存管理设施
抽象类
静态成员函数
常量成员函数
受保护的成员
重载运算符->和指向成员的指针
这是C++语言在标准化之前的最后一个版本。C++ 3.0版本于1991年完成,增加了类和函数模板。C++ 4.0版本本应在1993年发布,并增加异常处理功能。
AT&T计划推出新的C++编译器从未实现,而其他C++编译器,包括商业编译器(如Borland,IBM,DEC、Microsoft)和开源GNU编译器g++却出现了。因此,Stroustrup的工作重点转移到了语言的开发和标准化上。《C++注释参考手册》于1991年出版,成为语言标准的起点。该手册提供了C++的完整定义,而不仅仅是 Cfront 3.0 实现的功能,并经过了来自不同组织的许多人的审查。新功能包括命名空间、嵌套类和异常处理。
C++的ANSI标准化始于1989年,由惠普公司与AT&T、DEC和IBM联合发起。标准化该语言主要是由于这几个原因:添加重要的新功能,并防止不兼容方言的发展。1991年,国际标准化组织开始了标准化工作,此后各委员会举行了联席会议。
实时类型信息(RTTI:dynamic_cast、typeid)
协变返回类型
强制转换运算符
Mutable
布尔类型(Bool)
条件声明
成员模板
类内成员初始值设定项(In-class member initializers)
模板的单独编译(导出)
模板部分专用化
重载函数模板的部分排序
C++03是C++98的另一个维护版本,经过技术勘误批准的更正进行了修订。委员会还开始考虑C++0x。
被禁用的功能有:多重继承、模板、异常、RTTI、新式投人和命名空间。此外,标准库中还删除了STL和locales,并提供了iostreams的替代方案。有趣的是,EC++的使用并不多,而增加了模板的"Ectended EC++"超集更受欢迎。
内存模型
并发性
自动和声明类型
基于范围的for循环(Range-for)
移动语义和右值引用
统一初始化
空指针
常量表达式函数
用户定义的文本
原始字符串文本
属性
Lambdas(拉姆达斯)
可变参数模板
模板别名(使用)
Noexcept
覆盖和最终
静态断言
Long long
默认成员初始值设定项
在构造函数中初始化
枚举类
标准库也有了重大的补充。1998年,Boost组织成立,免费提供经同行评审的可移植C++源代码库。Boost库之所以重要,是因为它很早就提供了各种库功能,这样ISO标准就可以从中获益。内存模型是并发支持的重要基础,它提供了线程和锁。
二进制文本(0b)
数字分隔符
变量模板
函数返回类型推导
通用lambda
constexpr函数中的局部变量
移动捕捉
按类型访问元组
标准库中的用户定义的文本
类模板参数推导(推导指南介绍)
结构化绑定
内联变量
折叠表达式
条件下的显式测试
保证复制省略
更严格的表达式计求值顺序
自动作为模板参数类型
用于发现常见错误的标准属性
十六进制浮点文字
“if onstexpr”
协程(Coroutines)
概念
模块
其他新的语言功能包括:编译时计算支持、宇宙飞船运算符<=>、并发改进、指定的初始值设定项,以及非类型模板参数中的类类型(还允许字符串文字作为模板参数)。此外,新的标准库功能包括范围、日期、跨度和格式。
模块提供了一种比基于预处理器(包括从C语言继承的文件机制)更好的模块化表达方式。协程提供了一种无栈机制,用于执行顺序代码的异步操作。概念是对模板参数的要求的命名集合,是模板接口的一部分。它们使指定模板的预期用途成为可能,并在不满足约束条件时,大大提高了编译错误的清晰度。与以前使用的"替换失败不是错误(Substitution Failure Is Not An Error)"做法相比,这样可以避免出现约束违规时产生的冗长和复杂的编译错误,是一项显著的改进。
30 多年来,Perforce的静态分析工具Helix QAC和Klocwork在保障C、C++等语言的安全、可靠和高质量代码方面一直备受信赖。它们可以在您编写代码时识别缺陷、漏洞和合规性问题,并经过认证,可用于安全关键型应用。
作者简介:
弗兰克-范登博肯(Frank van den Beuken)
首席技术支持工程师,Perforce
作为技术支持专家,弗兰克在集成Perforce静态源代码分析解决方案以进行软件质量控制方面拥有超过20年的经验,服务于客户的软件开发环境。近年来,他专注于为各种编译器配置静态分析。他还提供代码质量培训和咨询服务。
Frank拥有Nijmegen大学数学与计算科学博士学位,研究领域为系统规范语言。
文章来源:https://bit.ly/48wKF0G