MISRA C++:2023 - MISRA C++ 标准的下一个版本就在这里!为了帮助您更好地了解新版本,Perforce 带来了 Misra C++:2023 博客系列的第二部分,作者是 Perforce 首席技术支持工程师 Frank Van den Beuken 博士。 要阅读第一篇文章,请单击......
在本文中,我们将深入探讨 C++ 的历史、编程语言多年来的发展情况以及下一步。 C++ 是一种常用的通用编程语言,可用于编写高效的程序。 正因为如此,它在汽车行业等注重安全的应用中很受欢迎,其中MISRA是最常用的编码标准之一。
让我们了解这门语言的迷人历史!C++是由丹麦计算机科学家Bjarne Stroustrup于2024年在AT&T贝尔实验室发明的。 它源于对 UNIX 内核的分析,目的是研究它可以在网络中分布多远。
当 Stroustrup 在剑桥大学计算实验室攻读博士学位时,他对 Simula 编程语言的程序组织和并发能力印象深刻,他用它编写了一个模拟器。 然而,他发现该语言的实现不能很好地扩展,所以他最终用 BCPL 重写了模拟器。 在AT&T贝尔实验室工作期间,Stroustrup决定用他在Simula中发现的那些有用的语言功能来增强C编程语言。 他开始编写预处理器 CPRE,将具有类似 SIMULA 类的 C 程序转换为可以使用现有编译器编译的普通 C。 这种新语言最初只是简单地命名"带类的 C 语言"。
从一开始,这种新语言的目标就是能够使用 C 可以使用的一切,因此它是一种通用编程语言。 此外,由于 C 编译器已经在许多平台上可用,因此它继承了 C 语言的可移植性,这是其重要的质量特征之一。 该语言的另一个目标是为 C 语言的不安全特性提供更好的替代方案,同时保持其效率和对底层硬件特性的直接访问。
带有类的 C 提供:类。
派生类。 公共和私人访问控制。
构造函数和析构函数。
调用和返回函数(由于不受欢迎,该函数很快被删除)。
流派的朋友。 函数参数的类型检查。
内联函数。 默认参数。
赋值运算符的重载。
在C++历史上的这一点上,该语言需要一个合适的名称。 有一段时间它被称为C84,但这个名字被认为是令人不快和令人困惑的。 最终,计算机科学家Rick Mascitti建议将其命名为C++,这可以理解为该语言是C的继承者。
随着语言能力的不断提高,CPRE 预处理器不再适用,于是创建了一个名为 CPfront 的编译器。 为了方便起见,cfront 仍然可以生成 c**,但它是一个正式的编译器,因为它对语法和语义进行全面检查,并生成程序的内部表示,每个范围都有一个符号表。 新的语言功能包括:虚拟功能。
函数名称和运算符重载。
引用。 不断。
用户对可用内存(堆内存)的控制。
改进了类型检查和 C++ 样式注释(实际上取自 BCPL)。
2024年,基于Cfront 1的《C++编程语言》一书的第一修订版出版0 编译器描述了 C++ 语言。 C++ 语言的第二个版本于 1989 年完成,提高了其定义和实现的稳定性。
c++ 2.新增 0:多重继承。
类型安全的链接。
改进了重载函数的分析。
赋值和初始化的递归定义。
改进了用户定义的内存管理功能。
抽象类。 静态成员函数。
常量成员函数。
受保护的成员。
重载运算符 - >和指向成员的指针。
这是 C++ 语言标准化之前的最后一个版本。 c++ 3.版本 0 于 1991 年完成,增加了类和函数模板。 c++ 4.版本 0 应该在 1993 年发布,并进行异常处理。
惠普在 1992 年初完成了最初的实施,但由于无法完成而没有发布。 AT&T推出新的C++编译器的计划从未实现,而其他C++编译器,包括商业编译器(例如Borland,IBM,DEC,Microsoft)和开源GNU编译器G++,出现了。 因此,Stroustrup 的重点转移到了语言开发和标准化上。 C++注释参考手册于2024年出版,成为语言标准的起点。 该手册提供了 C++ 的完整定义,而不仅仅是 Cfront 30 功能由来自不同组织的许多人实施和审查。 新功能包括命名空间、嵌套类和异常处理。
C++ 的 ANSI 标准化始于 1989 年,由惠普与 AT&T、DEC 和 IBM 合作发起。 该语言之所以标准化有几个原因:添加重要的新功能和防止不兼容方言的发展。 2024年,国际标准化组织(ISO)开始了标准化工作,此后各委员会举行了联席会议。
其中一项重要活动是定义标准库,包括标准模板库 (STL)。 此外,它还添加了:实时类型信息(RTTI:Dynamic Cast,TypeID)。
协方差返回类型。
胁迫运算符。
mutable
布尔类型 (bool)。
条件声明。 成员模板。
类内成员初始值设定项
模板的单独编译(导出)
模板部分专用化。
对重载函数模板进行部分排序。
C++03 是 C++98 的另一个维护版本,其修订版已通过技术勘误批准批准。 委员会也开始审议C++0X。
与此同时,包括东芝、日立、富士通和NEC在内的日本嵌入式系统工具开发商联盟提出了嵌入式C++(EC++)的子集。 这是为嵌入式系统编程而设计的。 此子集删除了可能影响性能或开发人员认为过于复杂而无法影响工作效率或正确性的语言功能。 禁用功能包括:多重继承、模板、异常、RTTI、新式强制转换和命名空间。 此外,STL 和语言环境已从标准库中删除,并提供了 iostreams 的替代方案。 有趣的是,EC++ 使用得不多,而是添加了模板"ectended ec++"超集更受欢迎。
作为对 EC++ 的回应,委员会发布了性能技术报告。 该报告提供了一个模型来说明与使用不同的 C++ 语言和库功能相关的时间和空间成本。 通过这种方式,它解决了人们对性能问题的担忧。 此外,它还提出了有效实施的技术。 因此,ISO 委员会没有批准 EC++。 这个版本引入了许多新的主要功能,所以对于很多程序员来说,它就像一门新语言!C++11 添加了新的内存模型。
并发。 自动和声明类型。
范围-for循环
移动语义和右值引用。
统一初始化。
空指针。 常量表达式函数。
用户定义的文本。
原始字符串文本。
属性。 lambdas(lambdas)
可变参数模板。
模板别名(已使用)。
noexcept
覆盖范围和终结性。
静态断言。 long long
默认成员初始值设定项。
在构造函数中初始化。
枚举类。 标准库也增加了一个重要的内容。 1998 年,Boost 组织成立,旨在提供一个免费的同行评审、可移植的 C++ 源代码库。 Boost 库很重要,因为它在早期提供了各种库功能,以便 ISO 标准可以从中受益。 内存模型是并发支持的重要基础,提供线程和锁。
移动语义可以更有效,因为它消除了不必要的复制,这对于大型对象来说代价高昂。 它允许开发人员控制是否复制资产或是否应将其所有权转移到另一个对象,从而使他们能够控制对象的生命周期和资源管理。 ISO C++ 委员会打算更改主要和次要版本,因此 C++14 的目标是改进 C++11。 它添加:二进制文本 (0b)。
数字分隔符。
变量模板。 该函数返回类型派生。
通用 lambda
constexpr 函数中的局部变量。
移动捕捉。 按类型访问元组。
标准库中的用户定义文本。
在 C++14 发布后,C++17 应该是一个重大更新。 遗憾的是,此版本中没有一些主要的预期功能,例如概念和例程。 主要的新功能包括:类模板参数派生(在派生指南中介绍)。
结构化绑定。
内联变量。 折叠表达式。
在条件下进行显式测试。
省略了保证复制。
对表达式计数进行更严格的计算顺序。
自动作为模板参数类型。
用于发现常见错误的标准属性。
十六进制浮点文本。
if onstexpr”
其中一些新功能反映了对函数式编程风格的支持日益增加。 C++11 中的 lambda 已经提供了这方面的关键元素,但折叠表达式(一种方便的表示法,使用运算符将参数列表减少到单个值)和派生指南增加了语言的函数风格。 未在 C++17 中实现的主要功能在 C++20 中实现。 因此,这个版本是向前迈出的一大步,相当于从 C++03 迁移到 C++11,可以说这个版本是 C++17 应该有的一次重大升级。 主要的新语言功能包括: 协程
概念。 模块。
其他新的语言功能包括编译时计算支持、宇宙飞船运算符 <=>、并发改进、指定的初始值设定项以及非类型化模板参数中的类类型(也允许将字符串文字作为模板参数)。 此外,新的标准库功能包括范围、日期、跨度和格式。
与基于预处理器相比,模块提供了一种更好的方法来表达模块化,包括继承自 C 的文件机制。 协程提供了一种无堆栈机制,用于执行顺序异步操作。 概念是模板参数要求的命名集合,是模板接口的一部分。 它们可以指定模板的预期用途,并且在不满足约束条件时,可以大大提高编译错误的清晰度。 与以前的使用"替换失败不是错误"与避免发生约束冲突时发生的冗长而复杂的编译错误的做法相比,这是一个重大改进。
自 1979 年迈出第一步以来,C++ 已经走过了漫长的道路,并且仍在不断发展。 C++23即将发布,将进行小而重大的调整,而C++26的开发工作已经开始。 C++的受欢迎程度持续上升,其使用也在不断上升,包括通过虚幻引擎创建虚拟现实(VR)应用程序以及加密货币应用程序。 30 多年来,Perforce 的静态分析工具 Helix QAC 和 Klocwork 一直备受信赖,可以保持 C 和 C++ 等语言的安全、可靠和高质量**。 它们可以在您编写时识别缺陷、漏洞和合规性问题,并经过认证,可用于安全关键型应用程序。
Helix QAC 还提供了一个合规性模块,用于执行新的 MISRA C++:2023 指南。 Perforce 计划在标准发布时提供完整的 MISRA C++:2023 合规性模块。 关于作者:
弗兰克·范登博肯
Perforce 首席技术支持工程师
作为一名技术支持专家,Frank 在集成 PerForce 静态源**分析解决方案以在客户软件开发环境中进行软件质量控制方面拥有 20 多年的经验。 近年来,他专注于为各种编译器配置静态分析。 他还提供优质的培训和咨询服务。
Frank 拥有奈梅亨大学的数学和计算科学博士学位,他的研究重点是系统规范语言。
品**: