看ACE如何劫持main函數

看ACE如何劫持main函數
2009-07-28 22:19

用過ACE的都知道,程序的main函數必須寫成int main (int argc, char *argv[])的形式,這是爲什麼呢,看了ACE的源碼才知道,原來是……

 

看ace/OS_main.h中的一段代碼,就會恍然大悟:

 

#       define main /

ace_main_i (int, char *[]); /

ACE_BEGIN_VERSIONED_NAMESPACE_DECL /

ACE_Export int ace_os_main_i (ACE_Main_Base&, int, char *[]); /

class ACE_Main : public ACE_Main_Base {int run_i (int, char *[]);}; /

inline int ACE_Main::run_i (int argc, char *argv[]) /

{ /

return ace_main_i (argc, argv); /

} /

ACE_END_VERSIONED_NAMESPACE_DECL /

int /

ACE_MAIN (int argc, char *argv[]) /* user's entry point, e.g., wmain */ /

{ /

ACE_Main m; /

return m.run (argc, argv); /*ace_os_main_i (m, argc, argv);   what the user calls "main" */ /

} /

int /

ace_main_i

原來ACE把main定義成一個宏,該宏首先對函數進行前項聲明:

ace_main_i (int, char *[]);

 

接着定義ACE_Main類,該類實現了ACE_Main_Base基類中的純虛函數run_i,在ACE_Main::run_i中調用ace_main_i函數。

 

 

再接着又定義了ACE_MAIN函數,而ACE_MAIN是一個宏:“#define ACE_MAIN main”,也就是說,ACE_MAIN這裏才真正定義了main函數。

 

再接下來就是ace_main_i函數的定義,到這裏宏擴展完畢,接下來就是我們自己寫的main函數的參數列表和函數原型。

 

總結起來,就是ACE把我們自己寫的main函數修改成ace_main_i函數,然後自己又重新定義了一個main函數,在ACE的main函數裏面,聲明ACE_Main對象,並調用其run方法,run函數對ACE做一些必要的初始化後,再調用run_i,run_i又調用ace_main_i,從而進入我們自己定義的main代碼。

 

上述的run、run_i以及ACE自定義的main函數都是int main (int argc, char *argv[])的形式,也因此,我們的main函數也就必須定義成這種形式,否則會在鏈接時報錯。

http://space.baidu.com/gamedot/blog/item/5373448bb3c328dafc1f1014.html

發佈了7 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章