C語言中函式指標與軟體設計經驗總結

2022-10-04 00:09:19 字數 2276 閱讀 4473

函式指標與軟體設計

記得剛開始工作時,一位高手告訴我,說,longjmp和setjmp玩得不熟,就不要自稱為c語言高手。當時我半信半疑,為了讓自己向高手方向邁進,還是花了一點時間去學習longjmp和setjmp的用法程式設計客棧。後來明白那不單是跳來跳去那樣簡單,而是一種高階的異常處理機制,在某些情況下確實很有用。

為了顯示自己的技巧,也在自己的程式中用過幾次。漸漸發現這樣的技巧帶來的好處是有代價的,破壞了程式的結構化設計,程式變得很難讀,尤其對新手來說。終於明白這種技巧不過是一種調味料,在少數情況使用幾次,可以簡化對問題的處理。如果把調味拿來當飯吃,一定會本末倒置,寫出的程式會呈現營養不良之狀。

事實上,longjmp和setjmp玩得熟不熟與是不是c語言高手,不是因果關係。但是,如果可以套用那位高手的話,我倒想說如果函式指標玩得不熟,就不要自稱為c語言高手。為什麼這麼說呢,函式指標有那麼複雜www.cppcns.com嗎?當然不是,任何乙個稍有程式設計常識的人,不管他懂不懂c語言,在10分鐘內,我想他一定可以明白c語言中的函式指標是怎麼回事。

原因在於,難的不是函式指標的概念和語法本身,而是在什麼時候,什麼地方該使用它。函式指標不僅是語法上的問題,更重要的是它是乙個設計範疇。真正的高手當然不單應該懂得語法層面上的技巧,更應該懂得設計上的方法。不懂設計,能算高手嗎?懷疑我在誇大其辭嗎?那我們先看看函式指標與哪些設計方法有關:

與分層設計有關。分層設計早就不是什麼新的概念,分層的好處是眾所周知的,比較明顯好處就是簡化複雜度、隔離變化。採用分層設計,每層都只需關心自己的東西,這減小了系統的複雜度,層與層之間的互動僅限於乙個很窄的介面,程式設計客棧只要介面不變,某一層的變化不會影響其它層,這隔離了變化。

分層的一般原則是,上層可以直接呼叫下層的函式,下層則不能直接呼叫上層的函式。這句話說來簡單,在現實中,下層常常要反過來呼叫上層的函式。比如你在拷貝檔案時,在介面層呼叫乙個拷貝檔案函式。介面層是上層,拷貝檔案函式是下層,上層呼叫下層,理所當然。但是如果你想在拷貝檔案時還要更新進度條,問題就來了。一方面,只有拷貝檔案函式才知道拷貝的進度,但它不能去更新介面的進度條。另外一方面,介面知道如何去更新進度條,但它又不知道拷貝的進度。怎麼辦?常見的做法,就是介面設定乙個**函式給拷貝檔案函式,拷貝檔案函式在適當的時候呼叫這個**函式來通知介面更新狀態。

與抽象有關。抽象是物件導向中最重要的概念之一,也是物件導向威力強大之處。物件導向只是一種思想,大家都知道,用c語言一樣可以實現物件導向的程式設計。這可不是為了趕時髦,而是一種實用的方法。如果你對此表示懷疑,可以去看看gtk+、linux kernel等開源**。

介面是最高端的抽象。在linux kernel裡面,介面的概念無處不在,像虛擬檔案系統(vfs),它定義乙個檔案系統的介面,只要按照這種介面的規範,你可以自己開發乙個檔案系統掛上去。裝置驅動程式更是如此,不同的裝置驅動程式有自己一套不同的介面規範。在自己開發裝置開發驅動程式時,只要遵循相應的介面規範就行了。介面在c語言中如何表示?很簡單,就是一組函式指標。

與介面與實現分開有關。針對介面程式設計,而不是針對實現程式設計,此為《設計模式》的第一條設計準則。分開介面與實現的目標是要隔離變化。軟體是變化的,如果不能把變化的東西隔離開來,導致牽一髮而動全身,代價是巨大的。這是大家所不願看到的。

c語言既然可以實現物件導向的程式設計,自然可以利用設計模式來分離介面與實現。像橋接模式、策www.cppcns.com略模式、狀態模式、**模式等等,在c語言中,無一不需要利用函式指標來實現。

與松耦合原則有關。面向過程與物件導向相比,之所以顯得蒼白無力,原因之一就是它不像物件導向一樣,可以直觀的把現實模型對映到計算機中。面向過程講的是層層控制,而物件導向更強調的物件間的分工合作。現實世界中的物件處於層次關係的較少,處於對等關係的居多。也就是說,物件間的互動往往是雙向的。這會加強物件間的耦合性。

耦合本身沒有錯,實際上耦合是必不可少的,沒有耦合就沒有協作,物件之間無法形成乙個整體,什麼事也做不了。關鍵在於耦合要恰當,在實現預定功能的前提下,耦合要盡可能的鬆散。這樣,系統的一部分變化對其它部分的影響會很少。

函式指標是解耦物件關係的最佳利器。signal(如boost的signal和glib中的signal)機制是乙個典型的例子,乙個物件自身的狀態可能是在變化的(或者會觸發一些事件),而其它物件關心它的變化。一旦該物件有變化發生,其它物件要執行相應的操作。

如果該物件直接去呼叫其它物件的函式,功能是完成了,但物件之間的耦合太緊了。如何把這種耦合降到最低呢,signal機制是很好的辦法。它的原理大致如下:其它關注該物件變化的物件主動註冊乙個**函式到該物件中。一旦該物件有變化發生,就呼叫這些**函式通知其它物件。功能同樣實現了,但它們之間的耦合度降低了。

在c語言中,要解決以上這些問題,不採用函式指標,將是非常困難的。在程式設計中,如果你從沒有想到用函式指標,很難想像你是乙個c語言高手。

總結

C語言中的函式與指標

1.為什麼需要函式?2.函式優點 3.怎麼定義乙個函式 4.函式呼叫 5.函式的分類 庫函式和自定義函式 6.函式引數,7.在函式中,可以通過return語句結束函式的執行,也可以通過return語句返回乙個值 8.函式的遞迴呼叫,指標int a,b,c scanf d d d a,b,c prin...

C語言中的函式指標

開啟去年6月的乙個test.cpp檔案,發現對裡面測試的函式指標幾乎沒有印象了。溫故而知新,於是重新找到ansi c 裡面的說明 除了宣告指向整型數字 雙精度型數字和c語言其他資料型別的指標外,指標也能夠被宣告指向乙個函式 包含乙個函式的位址 指向函式的指標是可能的,因為函式名像陣列名一樣,它們本身...

C語言中的函式指標

1.函式指標的定義 顧名思義,函式指標就是函式的指標。它是乙個指標,指向乙個函式。2.函式指標的使用 我們定義了乙個函式指標,但如何來使用它呢?先看如下例 include include char fun char p1,char p2 int i 0 i strcmp p1,p2 if 0 i r...