C語言中的封裝

編程語言 C語言 數據結構 Windows 隨員筆記 2017-04-11

C++有封裝的特性,私有變量不允許調用者直接訪問,需要時,必須通過公開的接口進行操作。C語言其實也可以有。比如在調用API接口時,返回一個句柄指針,該指針類型為void *,不是某個數據結構。該數據結構稱為內部數據結構,可以在你的C源碼實現中定義。在windows下,有很多API接口都會返回類似HANDLE的句柄,基本上都是一個void *類型的指針,用戶使用HANDLE句柄進行後續的各種操作,比如CreateFile函數;linux下經常採用整數來表示一個句柄,socket函數會返回一個整數。在實現AP接口時,如果你的數據結構對用戶可見,那麼,用戶是有可能直接設置其中的變量的,用戶的這種直接修改變量的做法,可能與你的想法相差甚遠。

這種封裝是對用戶透明的,調用者不應當根據返回的句柄來猜測其數據結構,API實現者不保證直接使用該內部數據的合法性、正確性和可延續性,特別是windows下(源碼不公開)。對於windows的內部數據結構,用戶不清楚其內部是怎樣定義的,windows又沒有提供官方的API接口,用戶又要實現某些功能(比如干壞事)。一種做法是通過測試,得到某一個偏移量,確定其是某一個變量,然後修改訪問。這種做法其實是危險的,微軟提不提供某種API肯定是經過深思熟慮的。違反規定去幹事情,會帶來系統的不穩定。

封裝的意義之一在於: 某些變量的訪問非常不適合外部用戶來做,而適合實現者內部完成,調用者不應當關心其所代表的內部意義,並且內部的數據結構還很有可能會變化。

相關推薦

推薦中...