main函数之前还能运行程序?

在了解这个之前,我们首先要知道代码四区的概念:

  • 运行前:全局区,代码区
  • 运行后:堆区,栈区

堆区和栈区显然都是在程序运行后进行的,所以它们都是在main后面。

因此就需要从全局区和代码区入手,代码区显然不行,因此只剩下全局区了。

结果也就是可以定义全局对象或者变量。


方法一:

定义全局对象或者变量

全局变量:

当定义全局变量a的时候,就会调用show函数,因此也就在main函数前运行了show函数这段程序。

全局对象:

此时定义了全局对象a,所以就会调用类中的构造函数,因此构造函数这段程序也就在main函数之前运行了

两个的运行结果一样:


方法二:

  • 在函数开头加上 __attribute__((constructor)),就可以在main函数之前执行
  • 如果想要在main函数结束之后运行,可加上__sttribute__((destructor))
    (但是这个函数对编译器有要求,需要是GNUC的编译器(gcc,clang))

如下:

__attribute((constructor))void before()
{
    printf("before\n");
    func();
}


__attribute((destructor))void after()
{
    printf("after\n");

}

猜你喜欢

转载自blog.csdn.net/qq_46423166/article/details/113804059