目录
一.前言
我们知道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运行之后执行。同样的也可以利用其他方法,有兴趣的话也可以研究一下。
标签:__,函数,自定义,int,attribute,C++,Func,main From: https://blog.csdn.net/2401_85919417/article/details/142284056