智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 588|回复: 1
打印 上一主题 下一主题

c语言头文件使用规范

[复制链接]

1

主题

19

帖子

0

精华

高级会员

Rank: 4

积分
957
威望
485
贡献
290
兑换币
322
注册时间
2015-8-9
在线时间
91 小时
毕业学校
u集美大学
跳转到指定楼层
1#
发表于 2016-4-9 11:54:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

新手第一次写程序,头文件和.c文件的变量定义与声明没有弄清楚,结果出了很多错误。看了这个文档后才明白。
头文件只能声明变量而不能定义变量,在头文件中声明变量后还需要在.c文件中定义该变量。

【转载】C语言头文件使用规范
    C程序采用模块化的编程思想,需合理地将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求,在模块的划分上主要依据功能。模块由头文件和实现文件组成,对头文件和实现文件的正确使用方法是:

* 规则1 头文件(.h)中是对于该模块接口的声明,接口包括该模块提供给其它模块调用的外部函数及外部全局变量,对这些变量和函数都需在.h中文件中冠以extern关键字声明;

* 规则2 模块内的函数和全局变量需在.c文件开头冠以static关键字声明;

* 规则3 永远不要在.h文件中定义变量;
    许多程序员对定义变量和声明变量混淆不清,定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。如:
  • /*模块1头文件:module1.h*/  
  • int a = 5; /* 在模块1的.h文件中定义int a */  
  •   
  • /*模块1实现文件:module1.c*/  
  • #include “module1.h” /* 在模块1中包含模块1的.h文件 */  
  •   
  • /*模块2实现文件:module2.c*/  
  • #include “module1.h” /* 在模块2中包含模块1的.h文件 */  
  •   
  • /*模块3实现文件:module3.c*/  
  • #include “module1.h” /* 在模块3中包含模块1的.h文件 */  



    以上程序的结果是在模块1、2、3中都定义了整型变量a,a在不同的模块中对应不同的地址单元,这明显不符合编写者的本意。正确的做法是:

  • /*模块1头文件:module1.h*/  
  • extern int a; /* 在模块1的.h文件中声明int a */  
  •   
  • /*模块1实现文件:module1.c*/  
  • #include “module1.h” /* 在模块1中包含模块1的.h文件 */  
  • int a = 5; /* 在模块1的.c文件中定义int a */  
  •   
  • /*模块2实现文件: module2.c*/  
  • #include “module1.h” /* 在模块2中包含模块1的.h文件 */  
  •   
  • /*模块3实现文件: module3.c*/  
  • #include “module1.h”   /* 在模块3中包含模块1的.h文件 */  



    这样如果模块1、2、3操作a的话,对应的是同一片内存单元。

* 规则4 如果要用其它模块定义的变量和函数,直接包含其头文件即可。
    许多程序员喜欢这样做,当他们要访问其它模块定义的变量时,他们在本模块文件开头添加这样的语句:

  • extern int externVar;  


    抛弃这种做法吧,只要头文件按规则1完成,某模块要访问其它模块中定义的全局变量时,只要包含该模块的头文件即可。




回复

使用道具 举报

12

主题

241

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2665
威望
1275
贡献
750
兑换币
838
注册时间
2016-1-29
在线时间
320 小时
毕业学校
谢谢
2#
发表于 2016-4-9 19:00:52 | 只看该作者
给力
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-6-2 22:56 , Processed in 0.092128 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表