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;
}