c程序模块化的问题..
一般应该是 在写一个模块.c文件的时候,把它所对外的接口(全局变量上声明,函数声明)写在头文件中.也就是一个同名的.h文件.. 而其他不希望别人看到的变量和函数可 加上static.
..有些不明白的..
有人说,这个.c文件要包含自己的.h文件..是什么意思??.. 那些都是对外的接口阿..
还有.. 我某一个模块.h提供的变量,几乎其他所有模块都要用到..但提供的接口函数只有很少用到..
那其他的.c都会要include这个头文件..这样是不是没什么意义.. 或者我把大家都要用的变量放到一个
Global.h里,大家都包含它??
这方面有点混淆..请大家帮帮忙; ) 关注 这里面其实有两种风格。
一种讲求方便的风格追求,通过包含某一个全局的头文件,比如你说的Global.h就可以任意使用任意.c中提供出来的接口函数和变量。支持这种看法的人非常多。
另外一种讲求系统层次的人认为,必须要通过严格的接口限定,控制高层对底层的访问权限——不该提供的接口坚决不提供,你需要用到什么就提供什么,不允许跨越层次调用不应该由你调用的函数——这就是极端的局部封装论。
初学者,需要明白:
1、.c中存放所有的函数和变量,但是并非所有的函数和变量都希望提供给外部访问。对于那些不希望提供的接口,可以在.c文件中以static的形式加以声明,进行保护。
2、.h文件是.c文件的接口。其中只包含一些使用.c模块所必须用到的一些函数和变量,当然还有相关的结构体和宏。一个总的原则是,但凡外部使用.c中的函数时,不需要知道的信息,都不要在.h中透露。在.h中只放一些使用模块式所需要的最小信息。
3、为什么.c文件要包含自己的.h文件呢?其实很简单,因为.h文件中包含了一些结构体和宏的声明。这些内容是.c和其他调用.c模块的程序都需要知道的公共约定。通过.h文件,双方建立约定,所以.c文件需要包含这一约定;其他调用者也许要这样一个约定。就好比协议一式三份一样(这里是一式两份哈)。
4、关于开头我们所说的工程结构全局轮和极端的局部封装论,其实二者在不同的层次上拥有不同的适用范围,他们是不冲突的。一个工程往往由若干层次形成。每一个层次都有一个总的头文件,用于配置这一层次的信息,为外界提供一个总的接口。工程中,无论什么地方一旦要用到某一层次中的东西,只允许通过这个层次的总头文件来访问,而不允许进入层次内部,调用具体的模块接口。这是就是两种观点中偏向局部封装论的内容。在一个层次的内部,我们强调通过一个总的头文件,在层次内部,实现局部的任意调用,这就是两种观点中偏向全局论的方面。
一点个人观点,望大家拍砖头。
上传一个符合这个结构的工程木板,大家切磋下。
点击此处下载armok01166598.rar 先别管什么接口之类的东西,.h文件的本来用意是这样的:
A.c里定义了一个结构struct a和一个函数func,func中要用到struct A如:
struct A
{...};
void func(struct A a)
{...}
B.c和C.c也都要调用func,你可以分别在B.c和C.c中分别写入:
struct A
{...};
extern void func(struct A a);
为了方便,一些人把这段公共代码写进一个头文件A.h中,从此以后只要在A.c,B.c,C.c中简单的写一句#include "A.h"就可以了,不需要每次都粘贴复制一大堆。而且如果以后A.c中又有另外一个函数funcb被B.c和C.c调用,只需要在A.h中加入extern void funcb(struct A a);不必在B.c和C.c中分别加入。
至于A.c也要包含A.h,那是因为函数func中要用到struct A
罗嗦了一大堆,不知道有没有说明白,呵呵 谢谢~
最近和上司讨论了下.. 指出我的全局变量太多了.
所以导致接口不好做..以至出现了 多个.c文件需要某个.c中的一个变量.
必须把大量不必要的全局变量改成参数传递..
接口做成函数..
2楼大侠你的example我download下来认真看下 : ) 学习学习
页:
[1]