純C環境下實現標準函數的覆蓋

        最近在實現一個虛擬文件系統,簡單的說就是爲客戶提供一套fopen,fread這樣的一套函數,客戶在編譯的時候,如果定義了一個宏OS_EXIST,即由操作系統來提供文件系統,這樣的話直接調用c標準的文件操作函數。如果沒有定義OS_EXIST,則客戶調用的fopen這套函數由另外一套文件系統提供支持。那麼問題就來了,怎麼實現C環境下的標準函數覆蓋呢?

        其實原理很簡單,編譯器在編譯時候,會檢查類型重定義和函數從定義,此外,在鏈接時,鏈接器默認先鏈接用戶實現的函數,其次纔去尋找標準庫的lib來鏈接。

        假如要覆蓋標準的printf函數, 具體做法是:

        直接在.c文件裏面實現printf函數,注意,函數的定義要和標準庫的printf函數的聲明要吻合,參數不能多一個也不能少一個,參數類型也必須一致。

        最後直接只用printf函數即可。鏈接時連接器會優先鏈接自己實現的printf函數。


       

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章