一次重组程序的经历

3 篇文章 0 订阅
2 篇文章 0 订阅
整整费了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 *="*******"(我的问题就是-_-!),注意一下位置吧,最好换个地吧^_^

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值