标题:求解有关主函数返回值问题!!
只看楼主
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
你会不会问 我怎么知道入口点是上面那几个呢。。。

看linker的参数

http://msdn.

里面说的很明白了

摘录重点

Function name                                                            Default for

mainCRTStartup (or wmainCRTStartup)                    An application using /SUBSYSTEM:CONSOLE; calls main (or wmain)

WinMainCRTStartup (or wWinMainCRTStartup)        An application using /SUBSYSTEM:WINDOWS; calls WinMain (or wWinMain), which must be defined with __stdcall

_DllMainCRTStartup                                            A DLL; calls DllMain, which must be defined with __stdcall, if it exists



[ 本帖最后由 zklhp 于 2012-4-11 21:37 编辑 ]
2012-04-11 21:25
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
对 你说的很对 光说说是没法让你信服的 我明白 所以我列了以上的东西

上面的东东可以说是VS编译的C程序的初始化的真相了 如果你还不明白 那 我也没啥好说的了

喜欢钻研是好事 只要不钻牛角尖就好

祝成功

哦 我忘说一句话 为嘛我看link.exe的参数就知道程序的入口点是啥呢 win下是这样的 链接的时候决定入口点 也就是决定了程序的第一句话是什么 不知道其他平台咋弄的 编译原理里面可能也有罢 不过我是业余爱好者 编译原理这种东西当然没看过啦

哦 你会不会问操作系统的呢 那个可没代码 不过我能逆向出汇编来 不知道你看懂看不懂了。。。
2012-04-11 21:36
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
得分:10 
事实上,main()函数并不是真正的入口点,在程序运行的时候,真正的入口函数是mainCRTStartup()或者wmainCRTStartup(),在VC++6.0中是前者,所以在程序运行的时候,最先进入的函数是mainCRTStartup()函数。在这函数中,有初始化了很多东西,调用了很多函数,例如GetVersion()函数,_heap_init ()函数, GetCommandLineA ()函数,都是在main ()函数之前被调用的。用VC6.0可以看到调用顺序,如下图

main函数的返回值表示了退出标识,表示函数是以什么样的形式退出的,如果顺利的话就是返回0,这也是大多数人都会添上的语句,还有其他的返回值我也不是很清楚,可以自行查阅文档。不过,使用int main()并return 0;现在已经变成一种习惯了,也谈不上程序以什么样的形式结束(正常或非正常),就可移植性而言,使用有返回值的main函数会比较好。

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2012-04-11 21:37
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
以下是引用waterstar在2012-4-11 21:37:24的发言:

事实上,main()函数并不是真正的入口点,在程序运行的时候,真正的入口函数是mainCRTStartup()或者wmainCRTStartup(),在VC++6.0中是前者,所以在程序运行的时候,最先进入的函数是mainCRTStartup()函数。在这函数中,有初始化了很多东西,调用了很多函数,例如GetVersion()函数,_heap_init ()函数, GetCommandLineA ()函数,都是在main ()函数之前被调用的。用VC6.0可以看到调用顺序,如下图

main函数的返回值表示了退出标识,表示函数是以什么样的形式退出的,如果顺利的话就是返回0,这也是大多数人都会添上的语句,还有其他的返回值我也不是很清楚,可以自行查阅文档。不过,使用int main()并return 0;现在已经变成一种习惯了,也谈不上程序以什么样的形式结束(正常或非正常),就可移植性而言,使用有返回值的main函数会比较好。

哈哈 你发的不如我发的快。。
2012-04-11 21:38
ming_wl
Rank: 2
等 级:论坛游民
帖 子:6
专家分:28
注 册:2012-4-9
得分:0 
一种规定吧 告诉调用main的函数 知道 运行状况
2012-04-11 21:43
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
得分:0 
回复 24楼 zklhp
我说我回复的时候怎么卡了一会,原来速度被你抢去了。

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2012-04-11 21:45
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
https://bbs.bccn.net/viewthread.php?tid=24305&highlight=void%2Bmain

我让你们找 不知道你们找没找 我给你们翻出来罢

前辈们留给我们的财富啊 膜拜。。
2012-04-11 21:45
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
以下是引用waterstar在2012-4-11 21:45:26的发言:

我说我回复的时候怎么卡了一会,原来速度被你抢去了。

我纵横论坛十余年 抢到的沙发可绕地球两周。。
2012-04-11 21:46
cqm9266
Rank: 3Rank: 3
来 自:福建
等 级:论坛游侠
帖 子:174
专家分:186
注 册:2011-10-28
得分:5 
返回值 是为了方便调用函数时来判断 处理该函数得到的结果是否是你要的 如果main()函数返回一个返回值 因为main是唯一主函数 所以该函数返回的话 就不能执行任何函数了  main作为一条主线来带动整个程序的运行  返回的话 自然就是结束程序了  其他函数的返回值的多少 习惯根据0 1 来确定是否达到你想的效果吧  没有特殊规定 应该只是个就像用#define后面最好用大写一样的

没病的人说有病的人有病,有病的人说没病的人有病。到底是谁有病?
2012-04-11 21:49
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
得分:10 
楼上有点误区,其实main函数并不是唯一主函数,相反你可以自己定义主函数,在链接开关中修改下/ENTYR的名字就行了,不过,修改之后,程序开始并不会初始化堆栈,所以不能分配内存。

[ 本帖最后由 waterstar 于 2012-4-15 14:38 编辑 ]

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2012-04-11 21:53



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-365529-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.125024 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved