gcc 函数属性 __attribute__解读

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容