首页 > 编程知识 正文

c语言main函数的使用方法,c语言中的main函数的位置

时间:2023-05-05 00:09:54 阅读:271709 作者:4744

c++:谁调用了main/WinMain函数!

(2010-09-28 15:29:54)

标签:

it

main和WinMain函数都被操作系统调用!

WinMain函数的四个参数由操作系统传递过来!

//

我们都听说过一句话:“main是C语言的入口”。我至今不明白为什么这么说。就好像如果有人说:“挣钱是泡妞”,肯定无数砖头拍过来。这句话应该是“挣

钱是泡妞的一个条件,只不过这个条件特别重要”。那么上面那句话应该是

“main是C语言中一个符号,只不过这个符号比较特别。”

我们看下面的例子:

int main(int argc, char* argv)

{

return 0;

}

编译链接它:

cc test00.c -o test.exe

会生成 test.exe

但是我们加上这个选项: -nostdlib (不链接标准库)

cc test00.c -nostdlib -o test.exe

链接器会报错:

undefined symbol: __start

也就是说:

1. 编译器缺省是找 __start 符号,而不是 main

2. __start 这个符号是程序的起始点

3. main 是被标准库调用的一个符号

再来思考一个问题:

我们写程序,比如一个模块,通常要有 initialize 和 de-initialize,但是我们写 C

程序的时候为什么有些模块没有这两个过程么呢?比如我们程序从 main 开始就可以 malloc,free,但是我们在 main

里面却没有初始化堆。再比如在 main 里面可以直接 printf,可是我们并没有打开标准输出文件啊。(不知道什么是

stdin,stdout,stderr 以及 printf 和 stdout 关系的群众请先看看 C 语言中文件的概念)。

有人说,这些东西不需要初始化。如果您真得这么想,请您不要再往下看了,我个人认为计算机软件不适合您。

聪明的人民群众会想,一定是在 main

之前干了些什么。使这些函数可以直接调用而不用初始化。通常,我们会在编译器的环境中找到一个名字类似于 crt0.o

的文件,这个文件中包含了我们刚才所说的 __start 符号。(crt 大概是 C Runtime

的缩写,请大家帮助确认一下。)

那么真正的 crt0.s 是什么样子呢?下面我们给出部分伪代码:

///

section .text:

__start:

:

init stack;

init heap;

open stdin;

open stdout;

open stderr;

:

push argv;

push argc;

call _main; (调用 main)

:

destory heap;

close stdin;

close stdout;

close stderr;

:

call __exit;

实际上可能还有很多初始化工作,因为都是和操作系统相关的,笔者就不一一列出了。

注意:

1. 不同的编译器,不一定缺省得符号都是 __start。

2. 汇编里面的 _main 就是 C 语言里面的

main,是因为汇编器和C编译器对符号的命名有差异(通常是差一个下划线'_')。

3.

目前操作系统结构有两个主要的分支:微内核和宏内核。微内核的优点是,结构清晰,简单,内核组件较少,便于维护;缺点是,进程间通信较多,程序频繁进出内

核,效率较低。宏内核正好相反。我说这个是什么目的是:没办法保证每个组件都在用户空间(标准库函数)中初始化,有些组件确实可能不要初始化,操作系统在

创建进程的时候在内核空间做的。这依赖于操作系统的具体实现,比如堆,宏内核结构可能在内核初始化,微内核结构在用户空间;即使同样是微内核,这个东东也

可能会被拿到内核空间初始化。

分享:

喜欢

0

赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

评论并转载此博文

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。