Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1055521
  • 博文数量: 288
  • 博客积分: 10306
  • 博客等级: 上将
  • 技术积分: 3182
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-12 17:00
文章分类

全部博文(288)

文章存档

2011年(19)

2010年(38)

2009年(135)

2008年(96)

我的朋友

分类: 系统运维

2009-04-17 16:02:53

用过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

原来ACEmain定义成一个宏,该宏首先对函数进行前项声明:

ace_main_i (int, char *[]);

 

接着定义ACE_Main类,该类实现了ACE_Main_Base基类中的纯虚函数run_i,在ACE_Main::run_i中调用ace_main_i函数。

看ACE如何劫持main函数 - 地线 - 别再让虚假消息充斥这本已混乱的世界

 

再接着又定义了ACE_MAIN函数,而ACE_MAIN是一个宏:“#define ACE_MAIN main”,也就是说,ACE_MAIN这里才真正定义了main函数。

 

再接下来就是ace_main_i函数的定义,到这里宏扩展完毕,接下来就是我们自己写的main函数的参数列表和函数原型。

 

总结起来,就是ACE把我们自己写的main函数修改成ace_main_i函数,然后自己又重新定义了一个main函数,在ACEmain函数里面,声明ACE_Main对象,并调用其run方法,run函数对ACE做一些必要的初始化后,再调用run_irun_i又调用ace_main_i从而进入我们自己定义的main代码。

 

上述的runrun_i以及ACE自定义的main函数都是int main (int argc, char *argv[])的形式,也因此,我们的main函数也就必须定义成这种形式,否则会在链接时报错。

阅读(1779) | 评论(0) | 转发(0) |
0

上一篇:编译过程

下一篇:网络校时_NTP

给主人留下些什么吧!~~