在了解这个之前,我们首先要知道代码四区的概念:
- 运行前:全局区,代码区
- 运行后:堆区,栈区
堆区和栈区显然都是在程序运行后进行的,所以它们都是在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"); }