假如在main.c中有如下一段代码:
#include <stdio.h>
extern void do_something();
void main()
{
do_something();
printf("hello world.\n");
}
我们都知道,直接编译main.c会出现无法解析的外部符号错误或者没有定义的引用错误,如下图。
因为do_something函数没有定义嘛。
此时如果我把do_something的声明改成如下的样子:
__attribute__((weak)) void do_something();
再去编译main.c,就不会提示错误了。
为什么加了__attribute__((weak)) 这句话就能在没有函数定义的前提下,编译成功呢?
attribute((weak))这句话修饰的声明,就是一个弱引用。当编译器遇到弱引用的函数时,不管函数有没有定义,编译都不会报错的。
那么弱引用的实际意义又是什么呢?
弱引用多用在库文件的制作中,库函数中定义了弱引用的函数名,你对该函数进行定义,这样你写的代码就被库函数调用了。
下面举个例子。 比如库函数里有一个函数叫Method,定义了一个step_one的弱引用。
__attribute__((weak)) void step_one();
void step_two()
{
printf("Method step_two.\n");
}
void Method()
{
step_one();
step_two();
}
在你自己的源代码中,定义了step_one函数。如下
void step_one()
{
printf("myfunction step_one.\n");
}
此时如果你去调用库函数Method,就会输出:
myfunction step_one.
Method step_two.
以上就是弱引用的用法。