GNU C 的一大特色就是attribute 机制。attribute 可以设置函数属性(Function Attribute )、变量属性(Variable Attribute )和类型属性(Type Attribute )。
__attribute__ 书写特征是:__attribute__ 前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的attribute参数。
__attribute__ 语法格式为:__attribute__ ((attribute-list))
如果__attribute__参数设置为constructor,即__attribute__ ((constructor)),则被修饰的函数会在main()函数执行之前执行;若__attribute__参数设置destructor,即__attribute__ ((destructor)),被修饰的函数会在main()函数或者exit()函数执行之后执行。
在程序中有时希望在main()函数之前运行一段函数,比如初始化函数,注册函数等,会使用到gcc 的函数属性 __attribute__ ((constructor)),当函数被设置constructor属性,会在main()函数之前运行,完成预期的行为。
以__attribute__ ((constructor))为例,写下__attribute__修饰函数的写法:
声明和实现分离的写法:
void initAnnotationsFunc(void) __attribute__((constructor));
void initAnnotationsFunc() {
// _dyld_register_func_for_add_image(dyld_add_image_callback);
}
声明和实现不分离的写法:
__attribute__((constructor))
void initAnnotationsFunc( ){
}
constructor带优先级的写法:执行顺序:按照优先级从低到高执行(即依次执行101,102,103函数语句)
void initAnnotationsFunc1(void) __attribute__((constructor(101)));
void initAnnotationsFunc1() {
NSLog(@"initAnnotationsFunc1");
}
__attribute__((constructor(102)))
void initAnnotationsFunc2(){
NSLog(@"initAnnotationsFunc2");
}
__attribute__((constructor(103)))
void initAnnotationsFunc3(){
NSLog(@"initAnnotationsFunc3");
}
参考文献:
https://www.jianshu.com/p/3e624e3ff455
https://code84.com/737364.html
https://blog.csdn.net/houxiaoni01/article/details/119828543
https://blog.csdn.net/chenpuo/article/details/123721056