問題描述
某個工程中使用了一個庫,庫中包含很多個函數,其中有一個函數是
void foo(void);
現在,在新的工程中,需要對foo函數的邏輯功能進行修改。
由於foo函數是在庫裏面,直接修改foo函數的代碼是不現實的。
重新定義一個函數foo2並實現它,也是行不通的。因爲庫裏面很多地方都調用了foo(),不可能讓這些地方重新調用foo2()。
怎麼辦?
打補丁!
解決措施
使用以下代碼,可以替換 foo() 函數:
extern void ExtraFunc(void);
extern void $Super$$foo(void):
/* this function is called instead of the original foo() */
void $Sub$$foo(void)
{
ExtraFunc(); /* does some extra setup work */
$Super$$foo(); /* calls the original foo() function */
/* To avoid calling the original foo() function
* omit the $Super$$foo(); function call.
*/
}
$Supper$$foo 指代原來的函數foo(); $Sub$$foo 是用來替換的新函數,則鏈接器鏈接此函數取代原來的foo()函數。