`
waret
  • 浏览: 131533 次
  • 性别: Icon_minigender_1
  • 来自: 天津
文章分类
社区版块
存档分类
最新评论

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完成,某模块要访问其它模块中定义的全局变量时,只要包含该模块的头文件即可。
分享到:
评论

相关推荐

    C语言头文件组织与包含原则_c语言头文件_c语言头文件组织与包含原则_

    C语言头文件的编写规则,掌握后可以减少程序的BUG

    C语言在头文件中定义const变量详解

    C语言在头文件中定义const变量详解 在头文件中定义const不会有多变量的警告或错误,如果该头文件被大量包含会造成rom空间的浪费。 通过查看*.i文件的展开呢,可以发现每个.i文件都会有相应的变量展开。 查看*.map...

    辉芒微单片机C语言笔记-Robert.docx

    辉芒微单片机C语言笔记-Robert.docx

    C语言贪吃蛇源代码未使用结构体

    一个青涩的未使用结构体的贪吃蛇小实例,可以动手写一写,作为一个阶段性的实例,加深对二维数组等的理解,规则在运行后的框框下面,新手编写,模块化这一块做的不好,可在此代码基础上修改,大佬勿喷

    C语言随堂笔记.zip

    3、语法规则:第一条语句结束使用";"结束,(并不是一行结束) */ //定义一个函数,求两数中最大值 /* 定义函数语法格式: 数据类型 函数名称([参数列表]){ 函数体语句; [return 返回值;] }

    基础C语言练习题(全)

    对于入门的初学者适合的题目 如: 第1章:C语言基础 一、选择题 1、以下叙述中正确的是( ) ...5、下列语句中,符合C语言的书写规则的语句是( )。 A)int a;b;c; B)a=2:b=3; C)x=y+5 D)x+=5;

    C语言描述(中文),完整扫描版

    《算法精解:C语言描述》中的代码尤为值得强调:所有实现都采用C语言编写,所有代码都优先用于教学目的,所有代码都在4种平台上经过完整测试,头文件记录了所有公共的接口,命名规则适用于全书所有的代码,所有的代码...

    高级c语言程序编程思想

    1.2 头文件的结构 12 1.3 定义文件的结构 13 1.4 头文件的作用 13 1.5 目录结构 14 第2章 程序的版式 15 2.1 空行 15 2.2 代码行 16 2.3 代码行内的空格 17 2.4 对齐 18 2.5 长行拆分 19 2.6 修饰符的位置 19 2.7 ...

    C语言入门经典(第4版)--源代码及课后练习答案

    9.7 函数库:头文件 347 9.8 提高性能 348 9.8.1 内联声明函数 348 9.8.2 使用restrict关键字 348 9.9 设计程序 349 9.9.1 问题 349 9.9.2 分析 349 9.9.3 解决方案 351 9.10 小结 367 9.11 习题 368 第10...

    C语言标准教程第一章 C语言概论

     需要说明的是,C语言规定对scanf和printf这两个函数可以省去对其头文件的包含命令。所以在本例中也可以删去第二行的包含命令#include。同样,在例1.1中使用了printf函数,也省略了包含命令。  在例题中的主函数体...

    算法精解:C语言描述

    头文件记录了所有公共的接口,命名规则适用于全书所有的代码,所有的代码都包含大量注释……《算法精解:C语言描述》内容包括:数据结构和算法的概念,以及使用它们的原因和意义 指针和递归算法分析常用数据结构:...

    C语言基础习题集(基础内容经典考察)

    C语言基础练习题集(精选)内容如: 第1章:C语言基础 一、选择题 1、以下叙述中正确的是( ) ...5、下列语句中,符合C语言的书写规则的语句是( )。 A)int a;b;c; B)a=2:b=3; C)x=y+5 D)x+=5;

    《你必须知道的495个C语言问题》

    5.7 我的编译器提供的头文件中定义的NULL为0L。为什么? 57 5.8 NULL可以合法地用作函数指针吗? 57 5.9 如果NULL和0作为空指针常量是等价的,那我到底该用哪一个呢? 58 5.10 但是如果NULL的值改变了,比如在...

    你必须知道的495个C语言问题

    5.7 我的编译器提供的头文件中定义的NULL为0L。为什么? 5.8 NULL可以合法地用作函数指针吗? 5.9 如果NULL和0作为空指针常量是等价的,那我到底该用哪一个呢? 5.10但是如果NULL的值改变了,比如在使用非零...

    C语言大纲及课件

    在机器上调试、运行程序是提高程序设计能力,加深理解C语言的基本概念和语法规则的最好途径,只有多作练习、多上机,才能牢牢掌握的程序设计的方法与技能。  课程考试命题基本覆盖各章节要求掌握的内容,并适当突出...

    (谭浩强)c语言学习书

    需要说明的是,C语言规定对scanf和printf这两个函数可以省去对其头文件的包含命令。所以在本例中也可以删去第二行的包含命令#include。 同样,在例1.1中使用了printf函数,也省略了包含命令。 在例题中的主函数体...

    算法精解(C语言描述)Kyle Loudon 机械工业出版

    本书中的代码尤为值得强调:所有实现都采用C语言编写,所有代码都优先用于教学目的,所有代码都在4种平台上经过完整测试,头文件记录了所有公共的接口,命名规则适用于全书所有的代码,所有的代码都包含大量注释……...

Global site tag (gtag.js) - Google Analytics