一次重組程式的經歷

2021-03-31 23:57:59 字數 2959 閱讀 3256

整整費了n久功夫,終於重組好了畢設程式的構架,頭暈暈的,簡單敘述一下改寫的經過,分享一下自己的感受,順便自勉也整理一下思路o_o

系統環境:redhat 9.0

開發語言:c

編譯器:gcc

原來程式包含的檔案:sniff.h,sniff.c,**tp.c,main.c

makefile檔案內容:

--------------------------

cc=gcc

sniffer:sniff.o **tp.o main.o

$(cc) -lpcap main.o sniff.o **tp.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

**tp.o:**tp.c

$(cc) -c **tp.c -o **tp.o

clean:

rm -f *.o

rm -f *.*~

rm -f *~

--------------------------

原來的程式的基本資料結構,全域性變數都在sniff.h檔案裡,因為只有**tp乙個模組,比較簡單,做完**tp模組後現在想擴充乙個模組進去(webmail模組),然後發現問題出現了,首先,我希望**tp和webmail模組是分開的,即除了公用的一些資料結構以外,不要有其它的關聯,然後希望的程式呼叫過程大致是:

main->sniff->一些既定條件->子模組(**tp模組或者webmail模組)

這樣的話也有利於以後模組的擴充

然後我新建了**tp.h的標頭檔案,把只有**tp需用的資料結構放在裡頭,然後用sniff.h包含**tp.h,發現乙個問題:公用資料結構在sniff.h裡,**tp必須要用到,所以**tp需要包含sniff.h標頭檔案,而sniff.h是包含**tp.h的,汗@_@檔案迴圈包含,不行

於是我嘗試把公用的資料結構放在乙個公共的標頭檔案裡(main.h),再用**tp.h包含它,sniff.h包含**tp.h,這樣本來在邏輯上也成立,但是另外乙個問題又出現了:公》用資料結構webmail模組也得用的,那麼它需要包含main.h,那麼**tp模組和webmail模組同時包含了main.h標頭檔案,而這兩個模組是要共存在sniff模組裡頭的,暈,文》件重複包含,汗啊...想借鑑一下tcpdump的檔案組織方式....makefile檔案讓我有點暈....$_$

在同宿舍的提醒下在網上找了一下重複包含的解決方案,用定義巨集的方法處理完畢,然後又出現了奇怪的問題(具體怎麼怪的忘了,因為中間的怪錯誤太多了)又是multiple definition,又是undefined reference,暈@_@,確實剛開始應該好好確立一下程式的架構的,不然不會這麼暈呼呼的了

靜下心,認真想了一下,仔細的分析了程式模組之間呼叫的關係以及gcc編譯的特性,確定如果要解決整個問題,需要很好的解決中間各個模組的依賴性問題,之所以出》現混亂的模組之間的耦合,是由於資料與函式功能沒有明確的分開,以及全域性變數和各個模組介面沒有處理好關係,因此我按照這個思路先把包含的系統標頭檔案和通用的資料結構(ip頭結構等)拿出來放在乙個單獨的檔案裡,在各個模組裡頭就可以直接呼叫它而不與上層的呼叫函式有關,解決迴圈包含的問題,然後,將各個模組單獨》編譯,而在主控程式中只用到其中的介面,解決一些函式呼叫性的問題,終於成功重組了程式,並且自己對程式的邏輯把握更清晰

最後工程的程式檔案如下:sniff.h,sniff.c,webmail.h,webmail.c,**tp.h,**tp.c,main.h,main.c,dlib.h(通用資料結構及包含標頭檔案),funclib.h,funclib.c(通》用函式)

makefile檔案內容:

--------------------------

objs=funclib.o main.o sniff.o **tp.o

flag=-lpcap -o2

cc=gcc

myprog=sniffer

$(myprog):$(objs)

$(cc) $(flag) $^ -o $@

funclib.o:funclib.c dlib.h funclib.h

$(cc) -c $< -o $@

**tp.o:**tp.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 *="*******"(我的問題就是-_-!),注意一下位置吧,最好換個地吧^_^

一次佈線的經歷

一次佈線的經歷 由於公司要重sz搬遷到sd,sd區需要裝修整改,重新佈線。專案開始2012年10月份入職就開始入手 左邊是工廠區 辦公區 凹字形結構 共4層樓,是拼接房大部分是翻新,只有 內凹部分那裡新建 www.2cto.com 專案結束標誌以機房的ups,機房機架上的監控 伺服器 交換機,除錯完...

程式設計師一次很好的面試經歷

今年七月份畢業,所以現在來北京找工作,雖然學的也算不錯的,但是由於剛過年,將近兩個月沒看書,好多東西還是有點模糊了。所以找工作的時候不是很自信,來北京的第一場筆試就沒過,這更打擊了我的信心,所以決定好好看書,把扔下的東西都找回來。於是這兩天回來這裡,也在首頁看了很多文章,雖然也和朋友說,好多東西都忘...

一次安裝fedora linux的經歷

2個星期前吧,用pqmagic分了下區,結果重起後,系統就進不去了,估計是pqmagic破壞我的硬碟分割槽表。之前一直是聽別人說 pqmagic會破壞系統,今天算是讓我碰到了。在網上找了些資料,重新來恢復我的grub。root 和setup命令是重新來安裝 引導的,如root hd0,hda1 se...