• 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”。
  • 相关阅读:
    元宇宙产业委风语筑董事长李晖:到更多城市探索元宇宙“虚实结合”
    # nest笔记八:使用apifox导入swagger
    力扣题解26-30
    汽车电子 TLV1702AQDGKRQ1 比较器 通用 开路集电极
    Linux环境下使用Docker搭建Jenkins容器
    在Eclipse中使用Junit
    Linux从入门到放弃-CentOS 7安装Docker
    超声波气象站无需架设通讯线路,传输距离远,传输效率高
    android代码中打开系统设置界面(无线和网络设置,日期和时间设置, 辅助功能设置,电池信息)
    NAS与SAN简介
  • 原文地址:https://blog.csdn.net/HandsomeHong/article/details/139398887