本文主要说明weak和alias是什么和如何使用它
__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;
}
本文章仅供学习交流用禁止用作商业用途,文中内容来水枂编辑,如需转载请告知,谢谢合作
微信公众号:zhjj0729