当前位置: 首页 > news >正文

C++编程法则365天一天一条(323)main函数执行之前和之后的动作

在C和C++程序中,main 函数之前和之后执行的函数是由编译器、链接器和运行时环境共同决定的。以下是一些通常会在这些阶段执行的关键函数:

main 函数之前执行的函数

  1. 启动代码(Start-up Code):
    • 这是由编译器提供的一段代码,通常在程序的入口点(比如C中的 _start 或C++中的 __libc_start_main)调用 main 之前执行。
    • 该代码负责初始化程序执行环境,包括堆、栈和全局变量等。
  2. 全局和静态变量的构造函数(仅C++):
    • 在C++中,全局和静态对象的构造函数在 main 函数执行之前被调用。
  3. 静态初始化(Static Initialization):
    • 对全局变量和静态变量进行静态初始化,也就是在程序开始执行时,按照它们声明的顺序对它们进行初始化。
  4. 动态链接库的初始化(如果使用动态链接):
    • 如果程序依赖于动态链接库,那么在 main 函数执行前,相关的动态链接库会被加载和初始化。

main 函数之后执行的函数

  1. 全局和静态变量的析构函数(仅C++):
    • 在C++中,程序执行结束后(即 main 返回后),全局和静态对象的析构函数会被调用。
  2. 终止代码(Termination Code):
    • 类似于启动代码,终止代码负责清理运行时环境,确保资源得到正确释放,比如关闭文件和网络连接,回收内存等。
  3. exit 函数:
    • 在C和C++中,exit() 函数可以被用来终止程序,它会导致标准库的清理(例如调用注册给 atexit() 的函数)。
  4. 动态链接库的卸载:
    • 如果程序使用动态链接库,那么在程序结束时,这些库可能会被操作系统卸载。

这些函数和代码块的具体实现细节可能因编译器和操作系统的不同而有所差异,但它们构成了C/C++程序正常运行的基础架构。

下面是一个简单的 C++ 示例,演示了程序执行前后的动作:

#include <iostream>
#include <cstdlib>// 全局对象类
class GlobalObject {
public:GlobalObject() {std::cout << "GlobalObject constructor\n";}~GlobalObject() {std::cout << "GlobalObject destructor\n";}
};// 定义一个全局对象
GlobalObject globalObject;// atexit 注册函数
void exitFunction() {std::cout << "atexit registered function\n";
}int main() {std::cout << "Main function\n";// 注册 atexit 函数std::atexit(exitFunction);return 0;
}

在这个示例中,程序执行前的动作包括:

  1. 全局对象 globalObject 的构造,输出 “GlobalObject constructor”。
  2. atexit 函数注册 exitFunction,用于在程序退出时执行,但在 main 函数执行之前。

程序执行后的动作包括:

  1. main 函数执行,输出 “Main function”。
  2. atexit 注册函数 exitFunctionmain 函数执行完毕后被调用,输出 “atexit registered function”。
  3. 全局对象 globalObject 的析构,在程序退出时被析构,输出 “GlobalObject destructor”。
http://www.lryc.cn/news/360919.html

相关文章:

  • 阿里云短信服务使用(Java)
  • C++17之std::void_t
  • 零基础入门篇①⑥ Python可变序列类型--字典
  • C语言面试题1-10
  • Qt Designer工具如何修改MainWindow窗口的标题
  • 车辆前向碰撞预警系统性能要求和测试规程
  • C#实现winform中渲染图的展示
  • JTS库的讲解及使用
  • 【C++杂货铺】unordered系列容器
  • 模板-初阶
  • 重载运算符C++---学习笔记
  • SpringMVC枚举类型字段处理
  • 集成算法:Bagging模型、AdaBoost模型和Stacking模型
  • DW怎么Python:探索Dreamweaver与Python的交织世界
  • 算法(十三)回溯算法---N皇后问题
  • 论文阅读:Correcting Motion Distortion for LIDAR HD-Map Localization
  • Git操作笔记
  • 使用Python进行数据分析的基本步骤
  • NGINX优化
  • 【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
  • 《Python学习》-- 实操篇一
  • C# 集合(二) —— List/Queue类
  • 【TB作品】MSP430 G2553 单片机口袋板,读取单片机P1.4电压显示,ADC
  • 知乎x-zse-96、x-zse-81
  • 【Linux】Linux工具——yum,vim
  • ES 生命周期管理
  • 【JavaScript脚本宇宙】揭秘HTTP请求库:深入理解它们的特性与应用
  • 【强化学习】DPO(Direct Preference Optimization)算法学习笔记
  • vue3 todolist 简单例子
  • Linux项目编程必备武器!