ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

嵌入式c语言编程模块源文件和头文件的编写顺序

嵌入式c语言编程模块源文件和头文件的编写顺序 我在文章“嵌入式模块化编程降低耦合的有效手段”中提到活用static关键字是减少模块与模块之间耦合的重要手段。那么就存在一个问题编写模块源文件和头文件的时候是先写头文件内容还是先写源文件内容呢我以前的写法首先创建模块对应头文件和源文件并包含到项目中。然后先写头文件使用宏定义定义模块相关常量、定义自定义数据类型例如结构体数据类型或枚举数据类型然后使用这些自定义数据类型以及原生数据类型定义全局变量这里定义的全局变量。完成头文件后然后再编写源文件首先包含模块头文件然后定义全局变量最后定义函数完成各个函数内部函数体的内容编写,最后再回到头文件中完成API函数声明编写。我这样写代码的顺序有很多不妥之处因为这样写的代码中的宏定义自定义数据类型全局变量函数声明都默认是全局作用域的也就是无论是当前模块还是其他模块如果包含了头文件定义的所有这些宏定义、数据类型、全局变量、函数理论上都可以使用。这样写的代码没有考虑关键字static的文件内作用域。现在改进的写法首先创建模块对应头文件和源文件并包含到项目中。然后先编写源文件包含相关头文件然后定义宏定义完成模块相关常量定义然后定义自定义数据类型例如结构体数据类型和枚举数据类型然后根据这些自定义数据类型以及原生数据类型定义全局变量全局变量这里分两类静态全局变量也就是全部使用static修饰全局变量以及普通全局变量没有使用static修饰现在叫公共全局变量最后完成函数定义函数定义也分为两类static修饰的静态函数以及普通API函数没有使用static修饰开放给其他模块使用的函数公共全局变量。完成源文件编写后开始编写头文件。如果宏定义类型定义需要在其他模块源文件中使用需要将宏定义、类型定义挪到头文件中然后使用关键字extern修饰公共全局变量声明最后完成函数声明可以省略extern关键字。以上两种编写方法主要区别作用域的不同。方法一更倾向于文件间作用域默认定义的宏定义、类型定义、全局变量、函数在其他模块中都可以访问方法二更倾向于文件作用域默认定义的宏定义、类型定义、全局变量、函数定义大部分都在该模块对应源文件内作用域大部分内容其他模块是不会访问的只有少数部分是其他驱动模块文件中的函数访问的。我看了linux内核源码和uboot源码发现以方式二编写方式更多一些因此以后那种自己编写代码过程中具体过程应该是这样的首先完成头文件和源文件创建然后先编写源文件编写过程中使用static修饰静态全局变量和静态函数如果某些全局变量和函数是全局的在头文件中编写公共全局变量的声明和公共API函数的声明。以源文件为主头文件为次甚至可以先将源文件编写完成后再将需要声明的全局变量和API函数给在头文件中声明。方式二编写方式充分体现了模块编程的“隔离或者隐蔽性”方式二体现了“模块编程以静态全局变量和静态函数为主体公共全局变量和公共API函数为次要”的原则。
返回列表