美文网首页
gcc 函数属性 __attribute__解读

gcc 函数属性 __attribute__解读

作者: 麦田的守望者Sunshine | 来源:发表于2023-07-26 09:57 被阅读0次

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

相关文章

网友评论

      本文标题:gcc 函数属性 __attribute__解读

      本文链接:https://www.haomeiwen.com/subject/jckkpdtx.html