ACE程序的入口點
--loky 2008.4.7
用過ACE的都知道,我們的主函數被改寫了,加入了初始化的動作。主函數是被宏替換的。下面我們把main的宏替換內容找出來。輸出宏的代碼如下:
1 #include <ace/Log_Msg.h>
2 #define MACRO_(x) #x
3 #define DISPLAY_MACRO(x) (printf("%s",MACRO_(x)))
4
5 int main(int argc, char* argv[])
6 {
7 DISPLAY_MACRO(main);
8 return 0;
9 };
展開后的main為:
1 ace_main_i (int, char *[]);
2 __declspec (dllimport) int ace_os_main_i (ACE_Main_Base&, int, char *[]);
3 class ACE_Main : public ACE_Main_Base
4 {
5 int run_i (int, char *[]);
6 };
7 inline int ACE_Main::run_i (int argc, char *argv[])
8 {
9 return ace_main_i (argc, argv);
10 }
11 int main (int argc, char *argv[])
12 {
13 ACE_Main m;
14 return ace_os_main_i (m, argc, argv);
15 } int ace_main_i
這樣我們的原main函數變成了ace_main_i (int, char *[]);//15行
而在這之前先執行了int ace_os_main_i (ACE_Main_Base&, int, char *[]); //14行
我們來看看這個函數
1 ACE_Export int
2 ace_os_main_i (ACE_Main_Base &mbase, int argc, char *argv[]) /* user's entry point, e.g., main */
3 {
4 ACE_MAIN_OBJECT_MANAGER
5 return mbase.run (argc, argv); /* what the user calls "main" */
6 }
ACE_MAIN_OBJECT_MANAGER,這個宏完成了我們的初化化動作,聲明了一個ACE_OS_Object_Manager對象,構造函數中調用了init ()來初始化。init就是最后真正的初始化執行函數。這也是ACE程序為什么在MFC中要加入init()函數的原因,因為MFC不能通過main的展開來進行初始化。
初始化完成后,程序是怎么回到我們的業務處理上的呢,這個函數又調用了mbase的run,就是展開后的主函數中的m對象的run,而run函數又做了什么呢?
代碼會告訴我們:
1 int ACE_Main_Base::run (int argc, char *argv[])
2 {
3 return this->run_i (argc, argv);
4 }
run又調用了,ACE_Main_Base::run_i (argc, argv);
根據main宏展開后的代碼,我們發現run_i中調用了ace_main_i (int, char *[]),而這個函數就是我們程序中被替換掉的主函數,終于又轉到我們的處理單元來了。
posted on 2008-04-07 22:15
。。。。 閱讀(2626)
評論(2) 編輯 收藏 引用 所屬分類:
ACE