• 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 
    #include 
    
    // 全局对象类
    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”。
  • 相关阅读:
    如何查看BWP相关log
    JavaCV开发详解之1:调用本机摄像头并预览摄像头图像画面视频(建议使用javaCV最新版本)
    冒泡,选择,插入,希尔,快速,归并
    页面请求频繁导致Http11OutputBuffer触发OOM解决
    基于 Text-CNN 的情感分析(文本分类)----概念与应用
    大数据平台之Spark
    QScrollBar滚动条、QSlider滑块、 QDial表盘
    分布式任务调度平台——XXL-JOB
    Rocket MQ发送消息报错: service not available now
    word 题目和选项保存到数据库(文件解析)
  • 原文地址:https://blog.csdn.net/HandsomeHong/article/details/139398887