gcc为函数提供了几种类型的属性,其中包含:构造函数(constructors)和析构函数(destructors)。
程序员应当使用类似下面的方式来指定这些属性:
带有"构造函数"属性的函数将在main()函数之前被执行,而声明为"析构函数"属性的函数则将在main()退出时执行。
用法举例:
#include <iostream>
void breforemain() __attribute__((constructor));
void aftermain() __attribute__((destructor));
class AAA{
public:
AAA(){std::cout<<
"before main function AAA"<< std::endl;}
~AAA(){std::cout<<
"after main function AAA"<< std::endl;}
};
AAA aaa;
void breforemain()
{
std::cout<<
"before main function"<< std::endl;
}
void aftermain()
{
std::cout<<
"after main function"<< std::endl;
}
int main(int argc,char** argv)
{
std::cout<<
"in main function"<< std::endl;
return0;
}
输出结果:
void breforemain() __attribute__((constructor));
void aftermain() __attribute__((destructor));
class AAA{
public:
};
AAA aaa;
void breforemain()
{
}
void aftermain()
{
}
int main(int argc,char** argv)
{
}
输出结果:
before main function
in main function
after main function AAA
after main function
__attribute__((constructor))标志的代码将在main函数前调用,就像在C++里面的全局变量类的构造一样。
此时难免有疑问,全局类对象的构造跟__attribute__((constructor))以及destructor到底是什么执行顺序?
实验表示,全局类的构造过程发生在before_main()函数之前,而析构也发生在after_main()前面。