执行前后的代码

main执行之前和之后执行的代码可能是什么?
执行之前:
主要用于初始化系统相关资源

  • 设置栈指针
  • 初始化静态变量和全局变量。.data段的内容
  • 没有初始化的全局变量赋初始值
  • 全局对象初始化
  • 将main函数的参数传递给main函数,然后才真正运行main函数
  • attribute((constructor)) constructor参数让系统执行main()函数之前调用函数

执行之后:

  • 执行全局对象的析构函数
  • attribute((destructor)) destructor让系统在main()函数退出或者调用了exit()之后,调用我们的函数

C++从代码到可执行程序经历了什么?

  • 预编译:主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下
    • 删除所有的#define,展开所有的宏定义。
    • 处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。
    • 处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他 文件。
    • 删除所有的注释,“//”和“/**/”
    • 保留所有的#pragma 编译器指令,编译器需要用到他们
    • 添加行号和文件标识,便于编译时编译器产生调试用的行号信息,和编译时产生编译错误或警告是 能够显示行号
  • 编译
    • 把预编译之后生成的xxx.i或xxx.ii文件,进行一系列词法分析、语法分析、语义分析及优化后,生成相应的汇编代码文件
  • 汇编
    • 将汇编代码转变成机器可以执行的指令(机器码文件)。
  • 链接
    • 将不同的源文件产生的目标文件进行链接,从而形成一个可以执行的程序。
posted @ 2023-02-20 11:20  小秦同学在上学  阅读(18)  评论(0编辑  收藏  举报