我想遵循 MISRA C++:2023 编码指南。但它的目标是 C++17,而代码和编译器遵循 C++14。
文件内容如下:
本文档中的指南以 C++17 为目标,并且它们 当应用于该语言的其他版本时,可能不合适或不充分——具体来说,可能需要额外的指南来防止本文档未涵盖的不良行为。
但我将 C++14 视为 C++17 的子集(只有很少的重大更改)。我是否不符合 MISRA-C++-2023 或仅符合附加规则?
MISRA C++:2023文档本身是非公开的,所以很难给出权威的答案。但是,您的问题归结为“我可以编写符合 MISRA C++:2023 的 C++14 代码吗?”答案是“当然可以。”
现在,假设 MISRA C++:2023 规定“规则 42.42:每个程序必须包含至少一个折叠表达式。” 那么你就运气不好了,因为没有办法编写符合该规则的 C++14 程序。但我很确定 MISRA C++:2023 并没有实际上说过任何这样的话。正如 @Lundin 评论的那样,MISRA 更感兴趣的是禁止新奇功能而不是强制使用它们。
第二:正如 @NathanOliver 评论的那样,MISRA C++:2023 可能会说“规则 42.43:确保在同一表达式中没有对象被修改两次,除非它位于赋值表达式的相反两侧。例如,禁止使用
(a++) + (a++)
,但(a++) = (a++)
是允许的。”您必须足够聪明才能意识到,尽管 MISRA C++:2023 允许使用 (a++) = (a++)
,但在 C++14 中它仍然被禁止(即 UB)。 (该表达式的行为直到 C++17 才定义。)因此,这实际上不会阻止您在 C++14 和 MISRA C++:2023 的交集中编写良好的代码...但这确实意味着该文档的某些部分可能会产生误导,您必须小心。
但是,这对于 C++ 课程来说是正常的。即使您使用最新、最好的 MISRA C++:2023 和 C++23 或其他语言,您仍然可以轻松地编写一个包含错误的程序,要么不了解该语言的怪癖,要么只是通过编写错误。遵循 MISRA 的规则并不能消除这种机会。所以,我认为两者之间没有任何质的区别
在 MISRA C++:2023 和定义明确的 C++17 的交集中编写代码以及正确的程序行为
在 MISRA C++:2023 和定义良好的 C++14 的交集中编写代码以及正确的程序行为
后者并不比前者更难。
最后,工具怎么样? 为了断言您仍处于 MISRA C++:2023 范围内,您需要一个能够诊断 MISRA C++:2023 违规的编译器。你是否有一个?该编译器支持 C++14 吗?如果没有,那么你就完全不走运了。如果是这样,那么我确定你没问题。