zoukankan      html  css  js  c++  java
  • 【转载】C语言头文件使用规范

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

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

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

    * 规则3 永远不要在.h文件中定义变量; 
        许多程序员对定义变量和声明变量混淆不清,定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。如: 

    C代码 
    1. /*模块1头文件:module1.h*/  
    2. int a = 5; /* 在模块1的.h文件中定义int a */  
    3.   
    4. /*模块1实现文件:module1.c*/  
    5. #include “module1.h” /* 在模块1中包含模块1的.h文件 */  
    6.   
    7. /*模块2实现文件:module2.c*/  
    8. #include “module1.h” /* 在模块2中包含模块1的.h文件 */  
    9.   
    10. /*模块3实现文件:module3.c*/  
    11. #include “module1.h” /* 在模块3中包含模块1的.h文件 */  


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

    C代码 
    1. /*模块1头文件:module1.h*/  
    2. extern int a; /* 在模块1的.h文件中声明int a */  
    3.   
    4. /*模块1实现文件:module1.c*/  
    5. #include “module1.h” /* 在模块1中包含模块1的.h文件 */  
    6. int a = 5; /* 在模块1的.c文件中定义int a */  
    7.   
    8. /*模块2实现文件: module2.c*/  
    9. #include “module1.h” /* 在模块2中包含模块1的.h文件 */  
    10.   
    11. /*模块3实现文件: module3.c*/  
    12. #include “module1.h”   /* 在模块3中包含模块1的.h文件 */  


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

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

    C代码 
    1. extern int externVar;  

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

  • 相关阅读:
    sql server 中拥有相同字段值的记录某个字段合并问题解答
    一个SQL语句实例
    Sql server 2005中output用法解析
    SQl 2005 For XMl 简单查询(Raw,Auto,Path模式)转载
    .NET/C#中对对象集合进行查询的方法 以及相关的 Predicate<T> 及 Action<T> 的用法
    SQLServer Case具有两种格式:简单Case函数和Case搜索函数
    sql server compute by 子句用法实例
    vs2008 一件悲剧的事情
    SQl 2005 For XMl 简单查询(Raw,Auto,Path模式)
    SQL Server2005中四种排名函数的使用
  • 原文地址:https://www.cnblogs.com/sword03/p/1909343.html
Copyright © 2011-2022 走看看