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才是我们定义的函数;
- ACE_TMAIN的解析
- 从ACE_TRACE到ACE_TMAIN
- XML的解析 DOM解析
- XML的两种解析方式逐行解析(SAX解析)节点解析(DOM解析)
- snooper 的概要解析与详细解析
- Oracle的硬解析和软解析
- 解析JS的脚本解析引擎
- Oracle的硬解析和软解析
- Oracle的硬解析和软解析
- dom解析与sax解析的区别
- sax解析和dom解析的区别
- DOM解析与SAX解析的区别
- dom解析和sax解析的特点
- xml文件的解析--libxml库函数解析
- 解析”无法解析的外部符号“
- easyui 的页面解析 parser解析器
- quagga 的原理解析 zebra原理解析
- XML解析的两种解析方式
- C和C++混合编译
- 高速缓存污染 cache pollution
- MAKEFILE --变量
- Teradata 金融数据模型FS-LDM
- 搭建python+PyQt+Eric平台(东挪西凑反正是完整了)\
- ACE_TMAIN的解析
- javascript原生选择器的一些基本方法
- Mysql Case 使用
- 实现ListView的分页加载功能
- Flask-babel简单实例
- SGU 397 链表 或者 两个栈。
- Unity3D 使用 RenderTexture 做 UI 特效、动态阴影
- linux标准目录结构
- 80端口被NT kernel & System 占用pid 4