特殊的attribute机制
__attribute__机制是GNU C的一大特色,可以用来设置函数,变量和数据类型的属性,下面对工作中正好用到的两个属性做下简单介绍。
1. constructor
这个属性指定函数在main函数执行之前执行
static void RunBeforeMain(void) __attribute__ ((constructor)); void RunBeforeMain(void){ printf(“%s \n”, __FUNCTION__); } int main(void){ printf(“%s\n”,__FUNCTION__); return 0; }
输出顺序如下:
RunbeforeMain
main
weak: weak symbol. 若存在两个相同的全局符号时,会引发重定义错误. 如果使用weak attribute,则当weak symbol和non-weak symbol同时存在的时候,linker会使用non-weak symbol.若只有weak symbol存在的时候则只使用weak symbol.
alias: 设置函数的别名,如
void example() __attribute__((alias("__example")));
将example函数设为__example的别名
这两个属性结合起来使用可以在non-weak symbol没有声明的情况下仍然编译执行成功。
//strong.c
#include <stdio.h>
void StrongFun ( ) { printf("%s:%s\n", __FILE__,__FUNCTION__); }
//weak.c
#include <stdio.h> void StrongFun()__attribute__((weak, alias("WeakFun"))); void WeakFun ( ) { printf("%s:%s\n", __FILE__, __FUNCTION__); } int main(int argc, char **argv){ StrongFun(); return 0; }
单独链接时,
gcc -o weak weak.o
./weak
输出结果:
weak.c:WeakFun
同时链接时,
gcc -o strong weak.o strong.o
./strong
输出结果
strong.c:StrongFun
作者:coderkian
出处:http://www.cnblogs.com/coderkian/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。