搜索
bottom↓
回复: 5

c程序模块化的问题..

[复制链接]

出0入0汤圆

发表于 2007-8-15 17:49:51 | 显示全部楼层 |阅读模式
一般应该是 在写一个模块.c文件的时候,把它所对外的接口(全局变量上声明,函数声明)写在头文件中.



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



..有些不明白的..



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



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

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

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



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

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2007-8-15 21:24:27 | 显示全部楼层
关注

出0入296汤圆

发表于 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

出0入0汤圆

发表于 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



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

出0入0汤圆

 楼主| 发表于 2007-8-21 16:20:10 | 显示全部楼层
谢谢~



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

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

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

接口做成函数..





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

出0入0汤圆

发表于 2016-12-17 09:15:10 | 显示全部楼层
学习学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 22:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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