免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 61814 | 回复: 17
打印 上一主题 下一主题

高手必看:程序出了main()入口外还有其它的吗 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
1 [报告]
发表于 2006-04-05 11:37 |显示全部楼层
我不想杀人……

对于 C++ 来说,全局对象的构造就是在 main 之前发生的。
对于标准 C 来说,main 是唯一的入口,不过很多编译器都有参数可以自己指定入口,具体详情参见编译器的手册。

[ 本帖最后由 flw 于 2006-4-5 11:43 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2006-04-05 12:40 |显示全部楼层
原帖由 0521 于 2006-4-5 11:45 发表
之所以大多数程序的“入口”是 main,是因为连接器缺省会连接一个叫 crt0.o 或者 crt0.lib 之类的库,这个库才是一个程序真正的入口,这个真正的入口作了一段初始化之后将控制权交给 main。大多数情况下用户程序不 ...

你说的话基本上是正确的,不过概念有些混淆。
看来你还没有搞清楚 entry 和 stub/wrap 的区别。
按照你这个说法,真正的入口也不是 crt0.o 或者 crt0.lib 或者 librt.so,而是 loader,
甚至是 fork() 再或者是 fork_init()。再或者是系统 BIOS,再或者通俗一点说就是电源开关。

[ 本帖最后由 flw 于 2006-4-5 12:41 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2006-04-05 13:47 |显示全部楼层
原帖由 0521 于 2006-4-5 13:10 发表



跟电源开关有啥关系?
操作系统总要执行一个类似 fork() 的东西。创建一个进程。然后呢,它会从内核空间 “跳转” 到用户空间。用户空间的执行的第一条汇编指令我称为“入口”,不知道这么说没说明白。那  ...

不摁电源开关,程序怎么启动?
所以说,所有的 software 的总入口,也是唯一入口,就是电源开关。
你把【用户空间的执行的第一条汇编指令】【称为“入口”】,我却认为,所谓的”用户空间“只不过是操作系统实现技术上的说法,C/C++ 语言不一定要跑在计算机里,在人脑里一样可以跑,所以说,我把 ANSI 规定的入口,也就是 main 或者全局变量的构造函数,称为入口,而你所谓的入口,只能叫“stub”,或者“wrap”,也就是对 C 程序的一层“包装”。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2006-04-05 14:44 |显示全部楼层
原帖由 0521 于 2006-4-5 14:38 发表



这个没问题,我也这么觉得。
但我还是不想“觉得”开电源是程序的入口。

兄弟,看来我又不小心惹了你了。
可是我前面已经说过了,是 loader,呵呵。
谢谢你支持我的观点!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2006-04-05 14:48 |显示全部楼层
原帖由 net_robber 于 2006-4-5 14:42 发表


那是什么情况呢???能稍微说的详细点么??想知道,呵呵

现代 CPU 都支持特权级的概念,当然了,叫法可能不同,ARM 下就不这么叫,叫模式。

不同的模式下,可用的指令集不同,所以不是任何一条指令都可以随便执行的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2006-04-05 15:09 |显示全部楼层
原帖由 艾斯尼勒 于 2006-4-5 15:06 发表
长知识

不过前面有几贴的意思我没看明白是争论还是吵架

所以要说loader是入口我个人感觉怪怪的

那些都是OS在执行一个用户程序前的例行公事吧?能算入口不

感觉所说程序入口是指用户所编写的程序到底从 ...

正是!
C 的代码是从 main 开始的,
C++ 的是从全局变量的构造函数开始的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2006-04-05 17:35 |显示全部楼层
原帖由 albcamus 于 2006-4-5 17:28 发表
>loader 是计算机启动的入口 说得再根本一点是bios
观点根本错误。 不过这个不是一两句话解释清楚的, 建议看Linker & Loader和OS 引导的知识

他说的 loader 是 os loader,比如 grub

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2006-04-05 18:51 |显示全部楼层
原帖由 白色乌鸦 于 2006-4-5 18:37 发表
有趣

发现很多争论主要是由于人们对同一词语有不同的定义。

非常赞同这句话。
所以说,自然语言很多时候并不是高效的交流工具,因此才有了各种形式语言……
包括计算机语言、数学语言、逻辑语言,等等……

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2006-04-06 10:30 |显示全部楼层
原帖由 ouland 于 2006-4-6 09:18 发表
比较同意flw,

但偶认为main或者在编译时指定的主函数是真正的入口。C++也不例外。执行的优先次序和入口没关系。

C++ 不是这样的,C++ 的全局变量是在 main 之前初始化的,因此,它们的构造函数也会在这之前运行。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2006-04-06 15:30 |显示全部楼层
原帖由 ouland 于 2006-4-6 15:21 发表



请写一个不包含main的C++程序看看?(另,别使用编译器指定别的主函数)。允许你写无限多个全局变量

请您先了解一些《逻辑》有关的常识,OK?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP