Swordman 发表于 2007-8-15 17:49:51

c程序模块化的问题..

一般应该是 在写一个模块.c文件的时候,把它所对外的接口(全局变量上声明,函数声明)写在头文件中.



也就是一个同名的.h文件.. 而其他不希望别人看到的变量和函数可 加上static.



..有些不明白的..



有人说,这个.c文件要包含自己的.h文件..是什么意思??.. 那些都是对外的接口阿..



还有.. 我某一个模块.h提供的变量,几乎其他所有模块都要用到..但提供的接口函数只有很少用到..

那其他的.c都会要include这个头文件..这样是不是没什么意义.. 或者我把大家都要用的变量放到一个

Global.h里,大家都包含它??



这方面有点混淆..请大家帮帮忙; )

zhang_mike2000 发表于 2007-8-15 21:24:27

关注

Gorgon_Meducer 发表于 2007-8-15 23:27:49

这里面其实有两种风格。

一种讲求方便的风格追求,通过包含某一个全局的头文件,比如你说的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

ywhbn 发表于 2007-8-15 23:34:31

先别管什么接口之类的东西,.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



罗嗦了一大堆,不知道有没有说明白,呵呵

Swordman 发表于 2007-8-21 16:20:10

谢谢~



最近和上司讨论了下.. 指出我的全局变量太多了.

所以导致接口不好做..以至出现了 多个.c文件需要某个.c中的一个变量.

必须把大量不必要的全局变量改成参数传递..

接口做成函数..





2楼大侠你的example我download下来认真看下 : )

YuQingLiang 发表于 2016-12-17 09:15:10

学习学习
页: [1]
查看完整版本: c程序模块化的问题..