任何C++程序首先执行的函数是main函数?

 

C++   Primer中有这样一句话.  
   
  但如果我声明了全局的类对象,那首先应该调用构造函数啊  
   
  谢谢大侠指教!  
   
  问题点数:5、回复次数:21Top

 

1 楼lann64(昆仑大鹏@迦楼罗)回复于 2006-10-31 10:39:35 得分 0

lz怎么喜欢发无分贴提问呀?  
  帮你顶一下吧。Top

2 楼Sco_field(Michael Corleone)回复于 2006-10-31 10:45:23 得分 0

大哥...,等以前发的几个问题一结帖就没有分数拉~~  
   
  不是不想给啊,最少也得20分吧?  
  就给个几分还不如不给,  
  所以...  
  唉,穷人就是这样...Top

3 楼superxiaomm(小美)回复于 2006-10-31 10:57:33 得分 1

先是全局变量构成,再是创建主线程,然后调用main,main在主线程里面Top

4 楼Sco_field(Michael Corleone)回复于 2006-10-31 11:01:51 得分 0

xiaomm也赞成   标题得说法   有误了?Top

5 楼corrupt(喜欢 睡在床板下 的思考)回复于 2006-10-31 11:04:08 得分 0

还有   静态   函数...Top

6 楼yanran_hill(燕然)回复于 2006-10-31 17:14:08 得分 0

会先运行全局或静态类成员的构造函数,其实简单的输出几行日志,就可以自己知道结果了  
  main   只是提供给程序编写者的入口而已Top

7 楼taodm((不能收CSDN社区短信息,请莫浪费精力))回复于 2006-10-31 17:29:33 得分 1

呃,这个问题咋说呢  
  C语言没有构造函数问题,所以main差不多一定是第一个被调的函数了。  
  C++继承了这个说法,所以编译器会在mian里加上2个函数  
  int   main()  
  {  
          __enter_main();//于此构造所有全局变量  
          //你的代码  
          __exit_main();//于此析构所有全局变量  
  }  
  当然,也可能封装成  
  int   real_main()  
  {  
          __before_main();  
          main();  
          __after_main();  
  }  
  所以,在调用你写的main里面的第一行代码前,完全可能调用其它函数。Top

8 楼swimmer2000(时间是用来浪费的,所以每当我做了一点事都觉得很自豪)回复于 2006-10-31 17:58:57 得分 1

在调用main()之前和之后都会有一段代码.  
  而像全局的类对象就会在进入main之前初始化.  
  在main退出之后被清除.Top

9 楼zjc_love()回复于 2006-10-31 20:29:19 得分 0

质疑:  
  个人认为,在定义对象的时候自动调用构造函数,如果是全局变量的话,应该在main()函数之前被调用~~~~~``同意LZTop

10 楼yanran_hill(燕然)回复于 2006-11-01 09:18:29 得分 0

在C语言中,而不是C++中,可以这样试试一段代码  
   
  int   FuncWirteMsg()  
   
  static   int   g_nRetVal   =   FuncWriteMsg();  
   
  int   FuncWirteMsg()  
  {  
      printf   ("进入函数:FuncWriteMsg/n");  
      return   0;  
  }  
   
  int   main()  
  {  
      printf("进入main/n");  
      return   0;  
  }Top

11 楼taodm((不能收CSDN社区短信息,请莫浪费精力))回复于 2006-11-01 09:34:06 得分 0

呃,yanran_hill(燕然),真抱歉,C编译器会报  
  error:initializer   must   be   constantTop

12 楼hailongchang(什么时候才能看到星星啊。。。)回复于 2006-11-01 09:38:07 得分 1

程序入口点的总结:  
  每个程序在执行的时候,是由操作系统调用一个加载器,然后加载器在其上会调用c   startup   code,然后程序进入main函数,在main函数  
  用return返回后,进入_exit例程  
   
              0x080480c0<_start>    
                                        call     _libc_init_first    
                                        call     _init    
                                        call     atexit    
                                        call     main                             //改变入口点,就是改变了这条语句?  
                                        call     _exit  
  从上面的代码可以看出,main函数其实只是一个符号,我可以在任何时候用编译器来指定扮演main符号的角色,可以用  
   
  -e   entry         --entry=entry来指定用户编写程序的入口点  
   
   
  在win16中,编程时集成开放环境提供有一个.DEF的文件,在其中可以通过一个STUB指令,指定一个stub程序,我们经常看到的  
  this   programm   is   required   windows就是这个程序的产物,当然程序员也可自己指定stub程序,但是在win32下,不再允许程序员指定stub程序Top

13 楼mLee79()回复于 2006-11-01 10:14:18 得分 1

改变入口点,就是改变了这条语句?  
  --------------------------------------  
  不是,   是改掉了真正的程序的入口点,   不再是   mainCRTStartup   ,   所以   libc   ,   heap   等等都没有初始化,   调用依赖这些初始化的函数调用结果不可预测   ...  
   
  WIN32   也同样可以指定   stub   ,   link   /stub:xxx   即可   ...  
  Top

14 楼hailongchang(什么时候才能看到星星啊。。。)回复于 2006-11-01 10:18:10 得分 0

不是,   是改掉了真正的程序的入口点,   不再是   mainCRTStartup   ,   所以   libc   ,   heap   等等都没有初始化,   调用依赖这些初始化的函数调用结果不可预测   ...  
  ----------------------  
   
  startup   code   不是从main函数开始执行的  
   
  不明白你说的意思?Top

15 楼lw1a2(一刀 现在改六点下班了:()回复于 2006-11-01 10:24:01 得分 0

void   foo()   __attribute__   ((constructor));  
   
   
  int   main()  
  {  
  }  
   
  void   foo()  
  {  
          printf("Hello   from   %s   ",   __FUNCTION__);  
           
  }Top

16 楼mLee79()回复于 2006-11-01 11:20:33 得分 0

M$VC   的缺省的启动代码在   M$VC/CRT/SRC/CRT0.C   下,   看下就知道干了些啥   ....  
   
  Top

17 楼todototry(来csdn,学会扯淡了...)回复于 2006-11-01 12:21:59 得分 0

 

自己做了一个例子:

#include <iostream>
using namespace std;

int f()
{
 return 1;
}

int a = f();


int main()
{
 cout << a << endl;
    system("pause");
    return 0;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值