ACE_TMAIN的解析

来源:互联网 发布:windows最新服务器系统 编辑:程序博客网 时间:2024/05/21 14:43

      在ACE中,我们可以使用ACE_TMAIN函数代替常规使用的main函数来定义我们自己的主流程,那么这个宏是如何工作的呢?

     以下以windows版本ACE为例进行阐释:

           我们定义的函数原型int ACE_TMAIN (int, ACE_TCHAR *[]);

              ACE定义:    define ACE_TMAIN main

            1)于是替换第一步,函数原型成为:

                int main (int, ACE_TCHAR *[]);

            2)这个main函数其实并不是我们需要的主函数,其实它也是一个宏,其定义为

                #       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

         3)其中   ACE_BEGIN_VERSIONED_NAMESPACE_DECL和  ACE_END_VERSIONED_NAMESPACE_DECL定义了一个ACE_Main派生类,

                         这个派生类实现了run_i函数,并最终调用了ace_main_i函数,将该部分定义提取到宏main外面 ,于是main变成

                          #       define main \
                ace_main_i (int, char *[]); \
            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   

       4)其中的ACE_MAIN也定义为main,于是main最新变形为:

                #       define main \
                ace_main_i (int, char *[]); \
            int \
             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   

        5)用main替换第一步替换结果,于是有结果:

                 int  ace_main_i (int, char *[]); 

               int  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  (int, ACE_TCHAR *[])

              这些很清晰了,在main函数前声明了一个ace_main_i,main函数中最终会调用这个函数,在main函数后面是int ace_main_i(int, ACE_TACHAR*[])同我们定义的

             ACE_TMAIN体拼接到一起,现在一切都明显了,ace_main_i才是我们定义的函数;

           

 





   

0 0
原创粉丝点击