在C和C++程序中,main 函数之前和之后执行的函数是由编译器、链接器和运行时环境共同决定的。以下是一些通常会在这些阶段执行的关键函数:
main 函数之前执行的函数_start 或C++中的 __libc_start_main)调用 main 之前执行。main 函数执行之前被调用。main 函数执行前,相关的动态链接库会被加载和初始化。main 函数之后执行的函数main 返回后),全局和静态对象的析构函数会被调用。exit 函数:
exit() 函数可以被用来终止程序,它会导致标准库的清理(例如调用注册给 atexit() 的函数)。这些函数和代码块的具体实现细节可能因编译器和操作系统的不同而有所差异,但它们构成了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;
}
在这个示例中,程序执行前的动作包括:
globalObject 的构造,输出 “GlobalObject constructor”。atexit 函数注册 exitFunction,用于在程序退出时执行,但在 main 函数执行之前。程序执行后的动作包括:
main 函数执行,输出 “Main function”。atexit 注册函数 exitFunction 在 main 函数执行完毕后被调用,输出 “atexit registered function”。globalObject 的析构,在程序退出时被析构,输出 “GlobalObject destructor”。