C++如何在main函数之前执行自定义操作

目录

  • 一.前言
  • 二.利用全局变量的初始化机制
    • 1.利用构造函数
    • 2.用函数结果对全局变量赋值
  • 三.gcc可以利用__attribute__
  • 四.其他

一.前言

我们知道C++程序在main函数运行之前会先执行一些动作,比如一系列初始化动作,那么我们怎么让C++程序在main函数运行前执行一些自定义函数呢,这篇文章里会介绍一些方法。

二.利用全局变量的初始化机制

我们知道全局变量的初始化是在main函数运行之前,所以就可以利用这一点来实现。

1.利用构造函数

看代码

//main.cpp

class Demo
{
public:
	Demo(void)
	{
		//执行动作
	}

	~Demo(void) noexcept = default;
};

Demo demo;

int main(int argc, char* argv[])
{
	//执行main函数动作

	return 0;
}

这个示例中由于demo是全局变量,所以demo的初始化会在main函数运行之前。demo的初始化动作会调用构造函数,这样就可以在构造函数中做一些想要在main函数运行之前执行的动作了。

2.用函数结果对全局变量赋值

看代码

//main.cpp

int Func(void)
{
	//执行动作

	return 0;
}

int i = Func();

int main(int argc, char* argv[])
{
	//执行main函数动作

	return 0;
}

这个示例中由于i是全局变量,所以i的初始化会在main函数运行之前。demo的初始化动作需要调用函数Func(),这样就可以在Func()函数中做一些想要在main函数运行之前执行的动作了。

三.gcc可以利用__attribute__

看代码

//main.cpp

__attribute__((constructor)) void Func(void)
{
	//执行动作
}

int main(int argc, char* argv[])
{
	//执行main函数动作

	return 0;
}

这个示例中利用__attribute__设置函数Func()的属性,也可以让函数Func()在main函数之前执行。

四.其他

1.利用全局变量的初始化和利用__attribute__设置函数属性这两种方式,又是哪种会更先执行呢,有兴趣的话可以简单测试一下。

2.利用__attribute__设置函数属性的方法适用于gcc编译器,对于vs默认的msvc编译器不适用,但是msvc编译器可以利用#pragma的方式。

3.如果是想自定义在main函数运行之后的动作要怎么做呢,对于gcc还是可以利用__attribute__设置函数属性的方式来实现,看代码

//main.cpp

__attribute__((destructor)) void Func(void)
{
    //执行动作
}

int main(int argc, char *argv[])
{
    //执行main函数动作

    return 0;
}

这个示例中Func()函数就可以在main运行之后执行。同样的也可以利用其他方法,有兴趣的话也可以研究一下。

欢迎讨论,欢迎指正,欢迎转载。

你可能感兴趣的:(C++,c++,开发语言)