正在使用#include"部件.c";被认为是不良行为,还是有任何违反misra标准规则的行为?(潜在规则3-3-1)
到目前为止,据我所知,这通常被归类为不良做法,但可以用于某些场景,这对安全关键型应用程序有什么特别的担忧吗?
Misra规则3-3-1规定,具有外部链接的对象或功能应在头文件中声明
当您编写这样的程序时,它被称为统一构建。这种程序的一个很好的例子是Odin编程语言的编译器。所以这是可以做到的,但和其他任何事情一样,也有权衡。
专业人士
-
它将更多的源放入一个翻译单元中。这可以帮助优化,类似于链接时间优化的工作方式,因为编译器实际上可以从其他C文件中的函数中看到源代码。
-
减少项目文件中的混乱(减少标题),从而减少重复。
-
大大简化的结构;即使项目中有多个文件,也可以像只构建一个文件一样简单。
缺点
-
对于使用更常见做法的同事来说,更难理解。
-
您不能再在C文件中定义一个具有非常通用名称的静态变量,因为该C文件可能是更大的翻译单元的一部分。您最终会得到更详细的变量名。
-
它通常会减慢构建速度。构建系统(如make)可以通过只重新编译依赖于所有更改的内容来加快编译速度。如果你将事物组合成一个单独的翻译单元,那么每一次更改都需要构建整个单元。在大型项目中,这将导致在构建过程中消耗更多内存。
-
您无法并行化生成。
这是否违反了MIRSA
我实际上不知道,但这并不违反你发布的规则:
Misra规则3-3-1规定,具有外部链接的对象或函数应在头文件中声明
通过包含一个C文件,您知道外部链接更长,因为它们位于同一个翻译单元中。
您引用的是MISRA C++标准,而不是MISRA C标准。在MISRA C++标准规则3-1-1中,并没有限制您在其他C文件中包含C文件,因为任何C文件都可能相互包含,并且不会声明任何内容具有外部链接。规则/要求是关于外部链接的,而不是关于C文件的包含。我相信,如果他们添加一条包括其他C文件的规则,它将在";源文件包含";规则16-2-X,但我刚刚检查过,没有任何关于包含其他C文件的内容。就我个人而言,我不介意包含其他C文件,因为我认为#include只是一种复制和粘贴操作,可以按照您的意愿使用。
这也是一个安全问题,您可能不想提供您的代码,所以您只需将头文件和对象文件
正在使用#include"部件.c";被认为是不良做法
一般来说,是的。
通常,预处理器的文件包含功能是保留的,以支持将公共声明分解到它们自己的文件中,这样它们就不需要在多个源中重复。这种分解为除最小项目外的所有项目的可维护性提供了巨大的好处,而且它几乎是库可用性的要求。只包含这种声明的文件通常被称为"文件";标题";,并且通常用CCD_ 1后缀来命名。从这个意义上说,问题的一部分是关于文件命名和编程模式。
另一方面,包含函数或对象定义(与声明相反)的C源文件通常使用.c
后缀命名。C语言禁止在同一程序中对同一标识符(函数或变量名)进行多个外部定义,因此此类.c
文件不能被#include
d转换为对一个程序有贡献的多个翻译单元,如果它们被包括在一个翻译单元中,则它们也不能直接编译。从多个.c
文件构建程序的通常方法是独立编译它们,然后将它们链接在一起。
只要确保避免重复的定义,将#include
一个.c
文件转换为另一个文件并不是固有的错误。但这只有作为一种特殊目的的安排才有意义。它会带来额外的风险,而且就语言规范而言,它没有提供任何特别的优势。此外,由于它的运行与惯例相反,它往往会让开发人员感到惊讶和困惑——甚至可能是更有经验的未来用户。
是否存在违反misra标准规则的情况?(潜在规则3-3-1)
它本身并不违反MISRA规则3-3-1,但它使编写违反该规则的代码变得不那么痛苦。这是通过使所有需要的外部声明都可以放在一个.c文件中,再加上它的包含,而不是提供一个单独的头。
我看不出任何其他MISRA-2012规则会违反这样的纳入。但在代码审查中,这对我来说是站不住脚的。
规则3-1-1是一个MISRA C++:2008规则
适用的MISRA C:2012指南(可能是)第20.2条和第20.3条,其中并未禁止使用.c
扩展。
--
在MISRA C:2004中,规则8.5禁止在头文件(假定为.h
文件)中使用源代码。MISRA C:2012删除了此规则,以允许使用.h
0函数。
--
就我个人而言,我认为#include
创建.c
文件是个坏主意——这表明对语言、编译器和链接器的理解有误。
如果这样做,出于分析目的,展开的文件将被视为单个翻译单元。。。
(参见附属公司简介)