📜  在C中main()之前和之后执行的函数(1)

📅  最后修改于: 2023-12-03 15:23:22.812000             🧑  作者: Mango

在C中main()之前和之后执行的函数

在C语言中,程序在执行main()之前和之后可能会执行一些函数。这些函数在程序开始执行之前或者执行之后完成一些特殊的操作,例如初始化全局变量或者清理内存。接下来,我们将介绍这些在C中main()之前和之后执行的函数。

在C中main()之前执行的函数

在C中,程序在执行main()之前会首先执行以下两个函数:

  • 静态初始化:会初始化全局和静态变量,以及将未显式初始化的变量设置为0或NULL。
  • 构造函数(Constructor):当程序中有C++代码时,会先执行构造函数。如果程序中没有C++代码,这个步骤就被忽略。
静态初始化

静态变量是在程序的数据区分配存储空间。如果没有显式初始化,那么变量默认会被设置为0或者NULL,例如以下代码:

int i;    // 默认值为0
char *p;  // 默认值为NULL

如果你显式初始化了一个变量,那么它的默认值将被覆盖。例如:

int i = 1;         // i的值为1
char *p = "hello";  // p指向字符串"hello"

同时,在整个程序的生命周期中,静态变量都会存在于内存中,如果没有赋值,那么它的值就是0或NULL。静态初始化程序会在main()函数执行之前完成。

构造函数

在C++中,类可以有构造函数,用于对象的初始化。在程序运行之前,构造函数先于main()函数执行。因此,在程序启动时,主要执行的是静态全局对象的初始化,其次是调用了通过__attribute__((constructor))属性修饰的函数(即构造函数)。

在C中main()之后执行的函数

在程序执行完main()函数之后,会执行这些函数:

  • atexit()函数:当程序终止时将执行的函数。
  • 析构函数(Destructor):如果程序中包含C++代码,那么将执行析构函数。否则,这个步骤将被忽略。
atexit()函数

atexit()函数用于注册在程序退出时需要执行的函数。可以注册多个函数,这些函数将按照注册的顺序逆序执行。因此,最后注册的函数最先执行,第一个注册的函数最后执行。

这是一个简单的例子:

#include <stdio.h>
#include <stdlib.h>

void function1(void)
{
    printf("This is function 1.\n");
}

void function2(void)
{
    printf("This is function 2.\n");
}

int main()
{
    atexit(function1);
    atexit(function2);
    printf("Inside main()\n");
    return 0;
}

输出:

Inside main()
This is function 2.
This is function 1.
总结

在C中,程序在执行main()函数之前和之后会执行一些函数。在程序启动时,将执行静态初始化和构造函数。在程序终止时,将执行atexit()函数和析构函数。对于大型复杂的程序,这些函数可以用于执行初始化和清理工作,从而简化代码的复杂度。