举例:C++程序并不一定从main函数开始执行

superwt2001 2003-01-03 05:18:32
如题
...全文
1891 55 打赏 收藏 转发到动态 举报
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
fixopen 2003-07-11
  • 打赏
  • 举报
回复
to virginsoldier(北欧野马——哈根):
我也没有说是OS做的呀:)
cout是一个全局变量,是在main()之前初始化的。只要包含了《iostream》。
其实编译器在main前加入了启动代码,当然,可以认为是main第一句就是调用了初始代码。
flmn 2003-01-08
  • 打赏
  • 举报
回复
学习……
linuxuer 2003-01-08
  • 打赏
  • 举报
回复
程序运行之前要经过很多遍的扫描,每一遍呢都有一定的作用,然后才进行具体的执行。执行应该是从main开始。
solotony 2003-01-08
  • 打赏
  • 举报
回复
一切都从main开始。只是你写的代码与实际执行的不一样而已。。。。
你写main(){
}
执行可以是
main(){
something();
}
所以。。。
kittyno12 2003-01-08
  • 打赏
  • 举报
回复
sboom说的对,执行跟编译是两回事
virginsoldier 2003-01-08
  • 打赏
  • 举报
回复
fixopen(dup),对于你的问题,我是这样考虑的:
C++中对象是在第一次被使用时进行初始化的。也就是说,当你的那个程序执行时,先进入main()函数,当到cout处时,该对象由于是第一次使用,故在这里被初始化,并调用它的构造函数,构造该对象。并不需要操作系统来作这件事。所以你的那个程序还是从main()开始执行的。
skyfine 2003-01-07
  • 打赏
  • 举报
回复
写了一个这样的程序:
#include<iostream>
#include<conio.h>

int i=1;
class display{
public:
display(){
cout<<"Initialize"<<'\n';
}
~display(){
cout<<"Clean up"<<'\n';
}
};

display print;
int main(){
cout<<"Hello,world!"<<'\n';
--i;
cout<<i<<endl;
getch();
if(i==0) return main();
getch();
return 0;

}
虽然无法说明是否从main()开始,但至少全局的类在main()里并没有做什么。不然输入应该有两次初始化(或者有一次结束).
hot1985 2003-01-06
  • 打赏
  • 举报
回复
up
rockhard 2003-01-06
  • 打赏
  • 举报
回复
TC支持一个函数是在main之前执行的,有一个函数是在main之后执行的,但就是记不清楚了,哪位知道?
产品老唐 2003-01-06
  • 打赏
  • 举报
回复
确实可以不是从mian()开始,例如WinMain()
确实可以说是不同的哦~
fixopen 2003-01-06
  • 打赏
  • 举报
回复
并不是从main(或者WinMain, DllMain)开始执行的。对于程序,我们都知道它是由OS装入并执行的,那么,是不是装入以后,就跳到main的首指令开始执行呢?不是的。

比如:

#include <iostream>
using namespace std;

int main(void)
{
cout << "Hello, world!" << endl;
return 0;
}

如果从main开始执行,那么cout对象由谁构造,操作系统么?不会吧。操作系统是不是知道要构造一个cout对象的。你说它会?不,不可能。它怎么知道我是用C++写的程序,而不是用pascal写的程序呢?它怎么能知道我的程序里一定要用到cout对象呢?

所以,所有的全局对象和静态对象都是在main以前初始化的,并且不是由OS,而是你程序的一部分,它是由编译器插入的代码,一般情况下,它使用crt0.o这一库,详细情况可以看看os的具体文档。另外,scott meyer的书里面也有详细的阐述。
fanqing 2003-01-06
  • 打赏
  • 举报
回复
dos :main()
windows :winmain()
还有好象与宽字节有关,main、winmain的前面要添加一个字母
还有一个.net中的托管。
(具体看书我想不起来了)
rushman 2003-01-06
  • 打赏
  • 举报
回复
抛开具体的编译器,抛开具体的操作系统。
C/C++程序总是要一个调用入口,一般来说,这个入口就是main 。这样就有几个问题:
1、谁来调用这个入口?
一般来说,并不是操作系统直接调用,而是由操作系统提供的一段初始化代码来调用这个入口函数。这段代码由编译器在连接时放入可执行程序中,操作系统在载入程序后,执行这段初始化代码,然后,从这段代码调用 main 。因此,我们在连接时将程序的入口变为其他的函数是完全可以的。这也是为什么 Windows 应用程序的入口函数是 WinMain 的原因(当然又它的必要,入口函数的参数和一般的 main 不一样)。
2、一个程序的入口只有一个,也只能有一个。那么象楼上的朋友提到的,全局变量由谁来进行初始化?
一般来说是由 main 来进行初始化。在 main 函数中编译器会将各个模块全局变量的初始化代码放入其中(或者调用一个初始化函数)。但这并不是绝对的。编译器完全可以在调用 main 之前再加上一些代码,进行额外的初始化工作,这些工作往往和具体的编译器/连接起始相关的,不一定具有普遍性。
3、对于程序员来说,程序究竟是从哪儿开始执行的呢?
在决大多数情况来说,程序是从连接器决定的程序的主函数开始的。主函数不一定是 main ,也可能是其他的什么名字。在主函数开始之前,某些编译器也许会允许程序员加上自己的一些初始化代码,但这并没有普遍意义,而且也是不推荐的(对操作系统及编译器的初始化过程相当熟悉而且确实有必要的时候才会这样做)。

时间有限,就说这么多吧
个人看法,未必正确,仅供参考
俞庆平 2003-01-06
  • 打赏
  • 举报
回复
不想在这里再说什么,大家关注一下:

http://expert.csdn.net/Expert/topic/1325/1325042.xml?temp=.9593012
floatbit 2003-01-06
  • 打赏
  • 举报
回复
sc
WindTech 2003-01-06
  • 打赏
  • 举报
回复
深入浅出mfc中C++一章说得很细
guxing1001 2003-01-06
  • 打赏
  • 举报
回复
我也是新手,对c++不是很熟悉,对c掌握的还算可以,在c 中所以的程序都是从main开始执行的,但在执行之前还有编译过程,所以有些语句在编译的时间给开辟内存,但没有真正的被执行。
班门弄斧了,不好意思!!
liveljacky 2003-01-06
  • 打赏
  • 举报
回复
看不太明白,谁能给我解释一下
Maxwell 2003-01-06
  • 打赏
  • 举报
回复
好像是在main之前执行的函数是用预处理指令设定的,bc也有,之后执行的是不是有预处理指令我忘了。在exit()执行时调用的函数可以用atexit()登记,最多32个。
brapler 2003-01-06
  • 打赏
  • 举报
回复
study
加载更多回复(35)

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧