__attribute__是用来说明函数的属性,weak和alias分别是两个属性。
(一)强符号和弱符号:
强符号:已经初始化的全局变量和未被weak修饰的函数
弱符号:未初始化的全局变量和被weak修饰的函数
符号链接原理:链接器发现同时存在弱符号和强符号,优先选择强符号,如果发现不存在强符号,只存在弱符号,则选择弱符号
那么它们有什么用呢?比如我们想使用某个函数必须用到的函数,但是不知道该函数在其他地方有没有被定义,那么我们可以把该函数声明为弱符号。
eg:
void led_init() __attribute__((weak))
(二)alias
alias其实就是给函数起个别名,而不用定义
#include <stdio.h>
int test1()
{
printf("%s\n",__FUNCTION__);
return 0;
}
int test() __attribute__((alias("test1")));
int main()
{
test();
return 0;
}
上面对test的调用就是对test1的调用,简单吧
(三)weak_alias的用法
例一
//strong.c
#include <stdio.h>
void fun(char * s)
{
printf("_strong:%s\n",s);
}
#include <stdio.h>
void fun(char * s) __attribute__((weak,alias("_weak")));
void fun1(char* s) __attribute__((weak,alias("_weak")));
void _weak(char * s)
{
printf("_weak:%s\n",s);
}
//weak.c
//main.c
#include <stdio.h>
int main(int argc ,char * argv[])
{
fun("test");
fun1("test");
return 0;
}
~
~/test# ./a.out
_strong:test
_weak:test
从上面执行结果也能看出来:编译器先寻找强符号,没有强符号的函数再去找弱符号定义的函数。
例二:
#include <stdio.h>
#define weak_alias(name, aliasname) _weak_alias (name, aliasname)
#define _weak_alias(name,aliasname) extern __typeof (name) aliasname __attribute__ ((weak,alias(#name)));
void __fun(void)
{
printf("this is ___fun\n");
}
weak_alias(__fun,fun1);
int main(int argc,char * argv[])
{
__fun();
fun1();
return 0;
}