当前位置:正文

欧洲杯体育即module.c和module.h-开云·kaiyun(中国)官方网站 登录入口

发布日期:2025-12-20 15:22    点击次数:108

欧洲杯体育即module.c和module.h-开云·kaiyun(中国)官方网站 登录入口

本文假设读者已具备基本的C编译学问。如非罕见诠释,文中“源文献”指 * .c文献,“头文献”指 *.h文献,“援用”指包含头文献。

一、头文献作用

C说话里,每个源文献是一个模块,头文献为使用该模块的用户提供接口。接口指一个功能模块裸露给其他模块用以打听具体功能的范例。

使用源文献兑现模块的功能,使用头文献裸露单位的接口。用户只需包含相应的头文献就可使用该头文献中裸露的接口。

通止境文献包含的范例将设施中的各功能模块有计划起来成心于模块化设施联想:

1)通止境文献调用库功能。在许多面容,源代码未便(或不准)向用户公布,只消向用户提供头文献和二进制库即可。用户只需按照头文献中的接口声明来调用库功能,而不消关注接口奈何兑现。编译器会从库中索求相应的代码。

2)头文献能加强类型安全检查。若某个接口的兑现或使用时势与头文献中的声明不一致,编译器就会指出无理。这一通俗的规矩能大大消弱设施员调试、改错的职守。

在预经管阶段,编译器将源文献包含的头文献内容复制到包含语句(#include)处。在源文献编译时,连同被包含进来的头文献内容所有编译,生成筹商文献(.obj)。

如果所包含的头文献止境精深,则会严重缩小编译速率(使用GCC的-E选项可获取并稽察最终预经管完的文献)。因此,在源文献中应仅包含必需的头文献,且尽量不要在头文献中包含其它头文献。

二、 头文献组织原则

源文献中兑现变量、函数的界说,并指定聚积范围。头文献中书写外部需要使用的全局变量、函数声明及数据类型和宏的界说。

建议组织头文献内容时遵照以下原则:

1)头文献差异原则:类型界说、宏界说尽量与函数声明相分离,分别位于不同的头文献中。里面函数声明头文献与外部函数声明头文献相分离,里面类型界说头文献与外部类型界说头文献相分离。

防御,类型和宏界说巧合无法分拆为不同文献,比如结构体内数构成员的元素个数用常量宏示意时。因此仅分离类型宏界说与函数声明,且分别置于*.th和*.fh文献(并非强制要求)。

2)头文献的语义端倪化原则:头文献需要有语义端倪。不同语义端倪的类型界说不要放在一个头文献中,不同端倪的函数声明不要放在一个头文献中。

3)头文献的语义有关性原则:归拢头文献中出现的类型界说、函数声明应该是语义有关的、有里面逻辑关联的,幸免将无关的界说和声明放在一个头文献中。

4)头文献名应尽量与兑现功能的源文献疏通,即module.c和module.h。但源文献不一定要包含其同名的头文献。

5)头文献中不应包含土产货数据,以缩小模块间耦合度。

即唯一源文献我方使用的类型、宏界说和变量、函数声明,不应出当今头文献里。作用域限于单文献的独到变量和函数应声明为static,以注不测部调用。将独到类型置于源文献中,会栽植团聚度,并减少不消要的体式外漏。

6)头文献内不允许界说变量和函数,只可有宏、类型(typedef/struct/union/enum等)及变量和函数的声明。

罕见情况下可extern基本类型的全局变量,源文献通过包含该头文献打听全局变量。但头文献内不应extern自界说类型(如结构体)的全局变量,不然将迫使本不需要打听该变量的源文献包含自界说类型场所头文献[1]。

7)诠释性头文献不需要有对应的源文献。此类头文献内大多包含无数主张性宏界说或罗列类型界说,不包含任何其他类型界说和变量或函数声明。此类头文献也不应包含任何其他头文献。

8)使用#pragma once或header guard(亦称include guard或macro guard)幸免头文献叠加包含。#pragma once是一种非标准但已被当代编译器平淡因循的手段,它明确奉告预经管器“不要叠加包含面前头文献”。而header guard则通过预经管号令模拟相同活动:

使用#pragma once比较header guard具有两个优点:

① 更快。编译器不会第二次读取标志#pragma once的文献,但却会读多少遍使用header guard 的文献(寻找#endif);

② 更通俗。不再需要为每个文献的header guard取名,幸免宏名重名激发的“找不到声明”问题。

舛错则是:

#pragma once保证物理上的归拢个文献不会被包含屡次,无法怨家文献中的一段代码作#pragma once声明。若某个头文献具有多份拷贝(内容疏通的多个文献),pragma不成保证它们不被叠加包含。虽然,这种叠加包含很容易被发现并修正。

9)C++中要援用C函数时,函数场所头文献内应包含extern "C"。

被extern "C"修饰的变量和函数将按照C说话时势编译和联结,不然编译器将无法找到C函数界说,从而导致聚积失败。

10)头文献内要有面向用户的鼓胀审视,从利用角度描写接口裸露的内容。

三、 头文献包含原则

在实质编程中,每每因头文献包含不妥而激发编译时解释标志未界说的无理或叠加界说的劝诫。

要排斥标志未界说的编译无理,只需在援用标志(变量、函数、数据类型及宏等)前确保它已被声明或界说[4]。要排斥叠加界说的劝诫,则需合理联想头文献包含法例和端倪。

建议包含头文献时遵照以下原则:

1)源文献内的头文献包含法例应从最罕见到一般,

如:

优点是每个头文献必须include需要的关联头文献,不然会报错。

同期,源文献同名头文献置于包含列表前端便于检查该头文献是否自完备,以及类型或函数声明是否与标准库碎裂。

2)减少头文献的嵌套和交叉援用,头文献仅包含其真实需要显式包含的头文献。

举例,头文献A中出现的类型界说在头文献B中,则头文献A应包含头文献B,除此除外的其他头文献不允许包含。

头文献的嵌套和交叉援用会使设施组织结构和文献组织变得紊乱,同期变成潜在的无理。大型工程中,原有头文献可能会被多个其他(源或头)文献包含,在原有头文献中添加新的头文献每每牵一发而动全身。若头文献中类型界说需要其他头文献时,可将其建议来单独形成一个全局头文献。

3)头文献应包含哪些头文献仅取决于自己,而非包含该头文献的源文献。

举例,编译源文献时需要用到头文献B,且源文献已包含头文献A,而索性将头文献B包含在头文献A中,这是无理的作念法。

4)尽量保证用户使用此头文献时,无需手动包含其他前提头文献,即此头文献内已包含前提头文献。

举例,面积有关操作的头文献Area.h内已包含对于点操作的头文献Point.h,则用户包含Area.h后无需再手动包含Point.h。这么用户就不消了解头文献的内在依赖关联。

5)头文献应是自完备的,即在职一源文献中包含任一头文献而不会产生编译无理。

6)源文献中包含的头文献尽量不要有法例依赖。

7)尽量在源文献中包含头文献,而非在头文献中。且源文献仅包含所需的头文献。

8)头文献中若能前置声明(亦称前向声明[5]),就不要包含另一头文献。仅面前置声明不成安静或过于封闭时才使用include,如斯可减少依赖性方面的问题。

示举例下:

如上,在OmciChkFunc函数的兑现源文献内包含T_MeInfoMap和T_OmciMsg场所头文献即可。

另举一举例下:

如上,CompareRecFunc函数原型由其他头文献提供,此处为幸免头文献交叉援用界说其异名同构原型CmpRecFunc。

在不会引起歧义的前提下,头文献内尽可能使用VOID指针代替非基本类型的值变量或指针,以幸免再包含类型界说场所的头文献。但这将影响代码可读性并缩小设施扩充成果,应量度轻重。

9)幸免包含分量级的平台头文献,如windows.h或d3d9.h等。若仅使用该头文献极少函数,可extern函数到源文献内。如下:

若还使用该头文献某些类型和宏界说,可创建适配性源文献。在该源文献内包含平台头文献,封装新的接口并将其声明在同名头文献内,其他源文献将通过适细君文献迤逦打听平台接口。如下:

10)对于函数库(包括标准库和自界说的民众宏及接口)的头文献,可将其加入到一个通用头文献中。需要限制该头文献的体积(主淌若该头文献所包含的所有头文献内容大小),并确保所有源文献领先包含该通用头文献。示举例下:

防御,示例头文献内包含C库文献虽能简化包含,但却与规矩1碎裂。也可另外加多包含库文献列表的通用头文献。

11)若不细则类型、宏界说或函数声明场所头文献具体旅途,可在源文献中再次界说或声明,编译器会以redefined劝诫或conflicting无理给出类型、宏界说或函数声明场所头文献旅途。

四、代码文献组织原则

建议C说话名堂中代码文献组织遵照以下原则:

1)使用端倪化和模块化的软件开辟模子。每个模块只可使用场所层和下一层模块提供的接口。

2)每个模块的文献(可能多个)保存在一个寂寥文献夹中。

模块文献较多时可接收子目次的时势,物理上断毫不同端倪的文献。子目次下源文献和头文献应分开存放,如分别置入include和source目次。

3)用于模块裁减的条目编译宏保存在一个寂寥文献中,便于软件裁减。

4)硬件有关代码和操作系统有关代码与工程代码相对寂寥保存,以便于软件移植。

5)按疏通功能或有关性组织源文献和头文献。归拢文献内的团聚度要高,不同文献中的耦合度要低。

在对既有工程作念单位测试时,耦合度低的文献布局止境便于搭建环境。

6)声明和界说分开,使用头文献裸露模块需要提供给外部的类型、宏、变量和函数。尽量作念到模块对外部透明,用户在使用模块功能时无需了解具体的兑现。

7)当作对外接口的头文献照旧发布,应保握褂讪。修改时一定要谨慎。

8)文献夹和文献定名要大略反馈出模块的功能。

9)郑再版块和测试版块使用和洽文献,使用宏限制是否产生测试输出。

10)必要的审视不可枯竭欧洲杯体育。