天天看點

《C語言接口與實作:建立可重用軟體的技術》一2.2 實作

本節書摘來自異步社群《c語言接口與實作:建立可重用軟體的技術》一書中的第2章,第2.2節,作者 傅道坤,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

實作會導出接口。它定義了必要的變量和函數,以提供接口規定的功能。實作具體解釋了接口的語義,并給出其表示細節和算法,但在理想情況下,客戶程式從來都不需要看到這些細節。不同的客戶程式可以共享實作的目标碼,通常是從(動态)庫加載實作的目标碼。

一個接口可以有多個實作。隻要實作遵循接口的規定,完全可以在不影響客戶程式的情況下改變實作。例如,不同的實作可能會提供更好的性能。設計完善的接口會避免對特定機器的依賴,但也可能強制實作依賴于機器,是以對用到接口的每種機器,可能都需要一個不同的實作(也可能是實作的一部分)來支援。

在c語言中,一個實作通過一個或多個.c檔案來提供。實作必須提供其導出的接口規定的功能。實作會包含接口的.h檔案,以確定其定義與接口的聲明一緻。但除此之外,c語言中沒有其他語言機制來檢查實作與接口是否符合。

如同本書中的接口,本書描述的實作也具有一種風格化的格式,如arith.c所示:

除了〈arith.c functions 14〉,更複雜的實作可能包含名為〈data〉、〈types〉、〈macros〉、〈prototypes〉等的代碼塊。在不會造成混淆時,代碼塊中的檔案名(如arith.c)将略去。

在arith_div的參數符号不同時,它必須處理除法的兩種可能行為。如果除法向零舍入,而y不能整除x,那麼arith_div(x,y)的結果為x/y - 1,否則,傳回x/y即可:

前一節的例子,即将-13除以5,可以測試除法所采用的舍入方式。首先判斷x和y是否小于0,然後比較兩個判斷結果是否相等,即可檢查符号問題:

arith_mod可以按其定義實作:

如果arith_mod也像arith_div那樣進行判斷,那麼也可以使用%運算符實作。在相應的條件為真時,

加下劃線的子表達式是标準c對x%y的定義,是以arith_mod可定義為:

arith_floor剛好等于arith_div,而arith_ceiling等于arith_div加1,除非y能整除x:

繼續閱讀