包含 .c 而不是 header(.h) - MISRA C

问题描述 投票:0回答:2

使用#include "component.c" 是否被认为是不好的做法,或者是否存在任何违反 misra 标准规则的情况? (可能是规则 3-3-1)

到目前为止,我了解到它通常被归类为不良做法,但可以在某些场景中使用,对于安全关键型应用程序是否有任何特别关注?

Misra 规则 3-3-1 指出具有外部链接的对象或函数应在头文件中声明

c standards misra safety-critical
2个回答
0
投票

当你编写这样的程序时,它被称为 unity build。这种程序的一个很好的例子是 Odin 编程语言 的编译器。所以它可以做到,但就像其他任何事情一样,需要权衡取舍。

优点

  • 它将更多源代码放入单个翻译单元中。这有助于优化,类似于链接时优化的工作方式,因为编译器实际上可以从其他 C 文件中的函数中看到源代码。

  • 项目文件中的混乱更少(标题更少),因此重复更少。

  • 大大简化的构建;即使项目中有很多文件,它也可能像只构建一个文件一样简单。

缺点

  • 使用更常见做法的同事更难理解。

  • 您不能再在 C 文件中定义具有非常通用名称的静态变量,因为该 C 文件可能是更大翻译单元的一部分。你会得到更冗长的变量名。

  • 它通常会减慢构建速度。构建系统(如 make)可以通过仅重新编译依赖于所有更改的内容来加快编译速度。如果您将事物组合成一个翻译单元,则整个事物都需要为每次更改构建。在一个大项目中,这将导致在构建过程中消耗更多的内存。

  • 你不能并行构建。

这是否违反 MIRSA?

其实我也不知道,不过不违反你发的规则:

Misra 规则 3-3-1 指出具有外部链接的对象或函数应在头文件中声明

通过包含 C 文件,您知道不再有外部链接,因为它们在同一个翻译单元中。


0
投票

从您可能不想提供代码的角度来看,这也是一个安全问题,因此您只需提供标头和目标文件

© www.soinside.com 2019 - 2024. All rights reserved.