简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:理解GNU C的__attribute__ ((constructor))和__attribute__((destructor))在修饰函数时,如果没有构造/析构函数的调用顺序和如果有构造/析构函数的调用顺序。
<1>.GNU C的__attribute__ ((constructor))和__attribute__((destructor))的用法.
1.无构造和析构函数的情况
__attribute__ ((constructor)):被修饰的函数在main()函数之前被执行
__attribute__ ((destructor)):被修饰的函数在main()退出后执行
被__attribute__((constructor))修饰的函数,不用main函数调用,直接被系统调用,并且在main函数之前调用。
2.有构造和析构函数的情况
__attribute__((constructor)):被修饰的函数顺序:被修饰的函数--->构造函数--->main函数.
__attribute__((destructor)):被修饰的函数顺序:析构函数--->main函数--->被修饰的函数.
被__attribute__((constructor))修饰时:为静态构造函数,不用main函数调用,直接被系统调用,并且在main函数之前调用。
2.应用实例
#include <iostream>
using namespace std;
__attribute__((constructor)) void beforemain(){
printf("xxx----->%s(), line = %d\n",__FUNCTION__,__LINE__);
}
__attribute__((destructor)) void aftermain(){
printf("xxx----->%s(), line = %d\n",__FUNCTION__,__LINE__);
}
class TEST{
public:
TEST(){
printf("xxx----->%s(), line = %d\n",__FUNCTION__,__LINE__);
}
~TEST(){
printf("xxx----->%s(), line = %d\n",__FUNCTION__,__LINE__);
}
};
int main(){
//1.无构造函数和析构函数的情况下.
#if 0
printf("xxx----->%s(), line = %d\n",__FUNCTION__,__LINE__);
//调用顺序:beforemain()----> main() ----> aftermain().
//2.有构造函数和析构函数的情况下.
#else
TEST test;
printf("xxx----->%s(), line = %d\n",__FUNCTION__,__LINE__);
//调用顺序:beforemain()----> TEST() ----> main() ----> ~TEST() ----> aftermain().
#endif
return 0;
}