一次重组程序的经历

原创 2005年05月16日 23:07:00
整整费了N久功夫,终于重组好了毕设程序的构架,头晕晕的,简单叙述一下改写的经过,分享一下自己的感受,顺便自勉也整理一下思路O_O
系统环境:RedHat 9.0
开发语言:C
编译器:gcc
                                                                                                                                               
原来程序包含的文件:Sniff.h,Sniff.c,Smtp.c,main.c
makefile文件内容:
--------------------------
CC=gcc
                                                                                                                                               
Sniffer:Sniff.o Smtp.o main.o
        $(CC) -lpcap main.o Sniff.o Smtp.o -o Sniffer
main.o:main.c
        $(CC) -c main.c -o main.o
Sniff.o:Sniff.c
        $(CC) -c Sniff.c -o Sniff.o
Smtp.o:Smtp.c
        $(CC) -c Smtp.c -o Smtp.o
clean:
        rm -f *.o
        rm -f *.*~
        rm -f *~
--------------------------
                                                                                                                                               
原来的程序的基本数据结构,全局变量都在Sniff.h文件里,因为只有smtp一个模块,比较简单,做完smtp模块后现在想扩充一个模块进去(webmail模块),然后发现问题出现了,首先,我希望smtp和webmail模块是分开的,即除了公用的一些数据结构以外,不要有其它的关联,然后希望的程序调用过程大致是:
main->sniff->一些既定条件->子模块(smtp模块或者webmail模块)
这样的话也有利于以后模块的扩充
                                                                                                                                               
然后我新建了smtp.h的头文件,把只有smtp需用的数据结构放在里头,然后用sniff.h包含smtp.h,发现一个问题:公用数据结构在sniff.h里,smtp必须要用到,所以smtp需要包含sniff.h头文件,而sniff.h是包含smtp.h的,汗@_@文件循环包含,不行
于是我尝试把公用的数据结构放在一个公共的头文件里(main.h),再用smtp.h包含它,sniff.h包含smtp.h,这样本来在逻辑上也成立,但是另外一个问题又出现了:公>用数据结构webmail模块也得用的,那么它需要包含main.h,那么smtp模块和webmail模块同时包含了main.h头文件,而这两个模块是要共存在sniff模块里头的,晕,文>件重复包含,汗啊...想借鉴一下tcpdump的文件组织方式....makefile文件让我有点晕....$_$
在同宿舍的提醒下在网上找了一下重复包含的解决方案,用定义宏的方法处理完毕,然后又出现了奇怪的问题(具体怎么怪的忘了,因为中间的怪错误太多了)又是multiple definition,又是undefined reference,晕@_@,确实刚开始应该好好确立一下程序的架构的,不然不会这么晕呼呼的了
静下心,认真想了一下,仔细的分析了程序模块之间调用的关系以及gcc编译的特性,确定如果要解决整个问题,需要很好的解决中间各个模块的依赖性问题,之所以出>现混乱的模块之间的耦合,是由于数据与函数功能没有明确的分开,以及全局变量和各个模块接口没有处理好关系,因此我按照这个思路先把包含的系统头文件和通用的数据结构(ip头结构等)拿出来放在一个单独的文件里,在各个模块里头就可以直接调用它而不与上层的调用函数有关,解决循环包含的问题,然后,将各个模块单独>编译,而在主控程序中只用到其中的接口,解决一些函数调用性的问题,终于成功重组了程序,并且自己对程序的逻辑把握更清晰
最后工程的程序文件如下:Sniff.h,Sniff.c,WebMail.h,WebMail.c,Smtp.h,Smtp.c,main.h,main.c,DLib.h(通用数据结构及包含头文件),FuncLib.h,FuncLib.c(通>用函数)
makefile文件内容:
--------------------------
OBJS=FuncLib.o main.o Sniff.o Smtp.o
FLAG=-lpcap -O2
CC=gcc
MyProg=Sniffer
                                                                                                                                              
$(MyProg):$(OBJS)
        $(CC) $(FLAG) $^ -o $@
FuncLib.o:FuncLib.c DLib.h FuncLib.h
        $(CC) -c $< -o $@
Smtp.o:Smtp.c
        $(CC) -c $< -o $@
Sniff.o:Sniff.c
        $(CC) -c $< -o $@
main.o:main.c main.h
        $(CC) -c $< -o $@
clean:
        rm -f *.o
        rm -f *.*~
        rm -f *~
--------------------------
                                                                                                                                              
后记:在做一个工程之前确实应该好好思考一下程序的整个结构,各个模块的设计,以及各个模块之间的关系,与主控模块之间的关系等等,而一些技术性问题也许在一个好的设计里头也会变得不算什么了,而且当你习惯了这样设计程序以后,也许真的就爱上它了:)
                                                                                                                                              
PS:中间遇到的一些技术性问题,算是给自己以后提个醒吧T_T
1.文件重复包含性问题(一般为头文件):
在文件的首尾两端加上:
#ifndef _FILENAME_H
#define _FILENAME_H
.......
......
程序代码
......
......
#endif
2.文件循环包含问题:
重新设计架构吧,最好将数据,功能函数,和主控函数分离
3.multiple definition问题:
问题特征如下:
***.o(.rodata+0x0): multiple definition of `***'
***.o(.rodata+0x0): first defined here
检查一下你的全局变量,常数型变量的位置问题,尤其是char *="*******"(我的问题就是-_-!),注意一下位置吧,最好换个地吧^_^

记一次成功面试经历的问题和最近遇到的问题

多点触控的问题 面试问题
  • x2345com
  • x2345com
  • 2017年07月01日 00:11
  • 215

面试记录(三)

昨天收到了招行的电话面试记录一下 一.数据结构中的归并排序原理是什么,时间复杂度是多少 归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k...
  • w99shuzhi
  • w99shuzhi
  • 2016年09月24日 09:50
  • 111

记一次当面试官的经历

昨天不小心当了一把面试官,感觉比自己被面试还紧张(瀑布汗),但是总体来说还算应对沉稳,嘻嘻。 面试者三十多岁,四年Android开发经验,按照他的年龄我的感觉是应该应聘项目经理之类更高的职位,把这个疑...
  • wenping1980
  • wenping1980
  • 2015年08月25日 23:28
  • 908

一次气势恢宏的阅读经历

我跟着罗森博格在软件丛林里转了一圈。我看到了正在丛林中挣扎的远古巨兽,我看到了众多在软件花园中渐次凋零的花朵。近代科技革命运行于软件之上,但创造软件的艺术却仍旧藏身于暗处,秘不示人。即便对于那些专家也...
  • zyt157376
  • zyt157376
  • 2016年11月13日 10:57
  • 158

记一次购买小米的经历

元旦要到了,打算给妈妈换一部智能手机,她还从没用过呢,虽然工资不多,买一部红米觉得还是比较合适的,结果发现一件细节性的小事,有些感慨。 现在购买小米的途径很多,不一一介绍,但是从小米官方购买应该只有...
  • u010271735
  • u010271735
  • 2014年12月28日 23:07
  • 355

一次失败的经历

11月28日上午11点半参加完公司举办的程序设计竞赛,从考场中走出来我感到一阵羞愧难当,五道编程题目尴尬地挂了零蛋,在规定的时间内没有解出任何一道。 想为自己找点借口,因为确实比赛规定可以使用的编程语...
  • lyhmyway
  • lyhmyway
  • 2014年11月30日 23:58
  • 719

SAP往来重组

这个重组其实是一个财务概念。按照出具资产负债表的要求,客户和供应商的借方余额与贷方余额不能抵消,应分别列示为资产与负债,因此,出具资产负债表时,应收帐款、其他应收的贷方余额要转到负债与所有者权益方,应...
  • zhongguomao
  • zhongguomao
  • 2015年11月09日 14:43
  • 798

二十年前上厕所的经历

虽然已经将近20年了,我现在还清晰地记得那一幕。我到某地去是为了走亲戚。到那后发觉最大的困难是上厕所。当地的习惯是在屋后方便。但当时是夏天,有很多咬人的小虫子飞来飞去,每次XX我的屁股上都被咬了很多大...
  • redguardtoo
  • redguardtoo
  • 2005年03月21日 22:38
  • 2002

有些事情,一辈子坚持那么一次,就已经足够了 .

行行走走,走走停停。     于生命的三岔口,总是难以抉择。我不知道该向左、向右,还是原路直前。没有对没有错,不知道是好是坏,在迷茫中彷徨、挣扎,不知所终。经历了许多反反复复的情绪,越过了重重叠叠的...
  • giianhui
  • giianhui
  • 2012年02月22日 11:19
  • 863

记一次失败的面试经历

背景: 面试者:  王某(以下简称我)   嵌入式行业刚入门  10年工作经历  从事方向为:GPS、BD导航,物联网,车联网方向 面试官:前华为员工 3年工作经验,现为1 创业公司嵌入式部门le...
  • ffeige1984
  • ffeige1984
  • 2016年09月04日 03:15
  • 2314
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一次重组程序的经历
举报原因:
原因补充:

(最多只允许输入30个字)