特殊的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

 

2. weak, alias

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

你可能感兴趣的:(attribute)