如何在main函数之前和之后执行别的函数?
问题引入
我们通常会认为,程序的执行总是从main函数开始,到main函数结束。其实,这个说法并不准确。
具体细节,我们先不深究,我们就来说说,既然程序并不总是从main函数开始,到main函数结束。那我们可不可以在main函数之前和之后执行其他的函数呢?
C++解决方案
C++的解决方案很好理解:
基于全局变量在主函数运行之前的特性,定义一个全局的对象,在构造函数和析构函数中,分别调用其他的函数。这样就可以达到在main函数运行前构造对象时运行别的函数,在main函数之后析构对象时运行别的函数:
代码如下:
#include <iostream>
using namespace std;
void before_main()
{
cout << "before main()!" << endl;
}
void after_main()
{
cout << "after main()!" << endl;
}
class Obj
{
public:
Obj()
{
before_main();
}
~Obj()
{
after_main();
}
};
// 定义一个全局对象
Obj obj;
int main()
{
cout << "This is main function" << endl;
return 0;
}
运行结果如下:
C语言解决方案
Windows(VC、VS):
Windows环境下利用#pragma预定义,代码如下:
#include <stdio.h>
int before_main(void)
{
printf("before main!\n");
return 0;
}
int after_main(void)
{
printf("after main!\n");
return 0;
}
typedef int func();
#pragma data_seg(".CRT$XIU")
static func* before[] = { before_main };
#pragma data_seg(".CRT$XPU")
static func* after[] = { after_main };
#pragma data_seg()
int main(void)
{
printf("This is main function.");
return 0;
}
运行结果如下:
注:我们可以看到运行的结果只有
before
而没有after
;
博主这里的运行环境是VS 2019
;
可能的情况是:
该方法已经过时,最新的编译器对它进行了优化,或者不再支持,标准不同,不同的编译器可能出现的结果也就不同。
Linux(gcc):
在Linux环境的C编程中,可以利用__attribute关键字定义constructor和destructor,其中前者会在main函数之前执行,后者会在main函数之后执行。
代码如下:
#include <stdio.h>
__attribute((constructor)) void before_main()
{
printf("before main!\n");
}
__attribute((destructor)) void after_main()
{
printf("after main!\n");
}
int main(void)
{
printf("This is main function.\n");
return 0;
}
运行结果:
参考资料
【1】C/C++程序在main之前执行代码
【2】js0huang.C语言中怎么在main函数开始前执行函数.CSDN.2018.03.04