栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

main函数执行前编译器做了什么?

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

main函数执行前编译器做了什么?

main函数执行前编译器做了什么?
  • main函数执行前编译器做了什么?
    • 编译器做了什么
      • 初始化:堆/栈/指针
      • 初始化:其他环境
      • 所有初始化操作清单
    • 跳入main()函数执行

main函数执行前编译器做了什么? 编译器做了什么

编译器在编译一个工程时,默认的程序入口是_start符号,而不是main。符号main是一个约定的符号,它用来告诉编译器在一个项目中哪里是程序的入口点。程序员在开发一个项目时,也会遵守这个约定,使用main()函数作为项目的入口函数。
兵马未动,粮草先行。其实在main()函数运行之前,已经有“先头部队”代码提前运行了:它们主要完成运行main()函数前的一些初始化工作,如初始化堆栈指针等。

初始化:堆/栈/指针

栈是C语言运行的必备环境,C语 言函数调用过程中的参数传递、函数内部的局部变量都是保存在栈中 的。没有栈C语言就无法运行,因此在运行main()函数之前必须先运行一段汇编代码来初始化堆栈环境。

初始化:其他环境

设置好堆栈指 针后,这部分代码还要继续初始化一些环境:

  1. 初始化data段
    1.1 初始化static变量
    1.2 初始化global全局变量

  2. 给BSS段的变量赋初值

  3. 未初始化的变量给定默认值,如 int = 0;bool = false;指针 = NULL。

    将未初始化部分的赋初值:数值型short,int,long等为0,bool为FALSE,指针为NULL,等等,即.bss段的内容
    
所有初始化操作清单
  1. C语言运行的基本堆栈环境、进程环境。
  2. 动态库的加载、释放、初始化、清理等工作。
  3. 向main()函数传参argc、argv,调用main()函数执行。
  4. 在main()函数退出后,调用exit()函数,结束进程的运行。
跳入main()函数执行

完成初始化环境后, 这部分代码还会将用户传入的参数传递给main,最后才跳入main()函
数运行。
这部分初始化代码是在程序编译阶段,由编译器自动添加到可执 行文件中的。
这部分代码属于C运行库(C Running Time,CRT)中的 代码,编译器厂商在开发编译器时,除了实现C语言标准中规定的printf、fopen、fread等标准函数,还会实现这部分初始化代码,完成进入main()函数之前的一系列初始化操作。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/950413.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号