如何在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

猜你喜欢

转载自blog.csdn.net/m0_46308273/article/details/113794594