C++-编译器连接时的弱引用的作用是什么?

C++-编译器连接时的弱引用的作用是什么?

灵芸 发布于 2017-09-09 字数 135 浏览 1199 回复 2

最近在看《程序员的自我修养》,连接这一章中降到了强符号和弱符号、强引用和弱引用,我比较疑惑的是编译器连接时的弱引用的作用是什么?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

泛泛之交 2017-10-16 2 楼

强符号和若符号的概念就不解释了,之前有很多帖子说过这个问题了
解释一下强引用和弱引用,主要从编译器的角度来说吧。假设一个强引用,给出了生命但却没给定义的时候,编译器在编译阶段就会报错。而弱引用编译的时候就不会报错。例如下面的代码

__attribute__ ((weakref)) void foo();
int main()
{
if (foo) foo();
}

这时foo是一个弱引用。运行时会判断。若定义了foo就调用foo,若没有定义,就不调用。这个对于程序的裁剪和组合非常有帮助。举个例子,例如你不是QQ会员,那么提供你的功能的库函数里面就不给出foo这个函数的定义,那么你就没有会员特权了。假设你是QQ会员,只需要给出一个有foo函数定义的库,那么你就可以使用会员特权了。这样不需要改代码,只需要管理一下函数就可以轻松实现,所以说这个使程序的裁剪和组合更加容易。

甜柠檬 2017-09-15 1 楼

弱引用对于库来说很有用,比如说:
1.库中定义的弱符号可以被用户定义的强符号所覆盖,从而使程序可以使用自定义版本的库函数;
2.程序可以对某些扩展功能模块的引用定义为弱引用,当我们将扩展模块与程序链接在一起时,功能模块就可以正常使用;
如果我们去掉了某些功能模块,那么程序也可以正常链接,只是缺少了相应的功能。

在Linux程序设计中,如果一个程序被设计成可以支持单线程或多线程的模式,就可以通过弱引用的方法来判断当前的程序是链接到单线程的Glibc库还是多线程的Glibc库(是否在lpthread选项),从而执行单线程版本的程序或多线程版的程序。我们可以在程序中定义一个pthread_ create函数的弱引用,然后程序在运行时动态判断是否链接到pthread库从而决定执行多线程版本还是单线程版本

#include <stdio.h>
#include <pthread.h>

int pthread_create(pthread_t*,
const pthread_attr_t*,
void* (*)(void*),
void*) __attribute__((weak));

int main()
{
if (pthread_create)
{
printf("This is multi-thread versionn");
}
else
{
printf("Thi is single-thread versionn");
}
}

 ajaxhe@bbs:~/program/thread$ gcc weakDefined.c -o pt
ajaxhe@bbs:~/program/thread$ ./pt
Thi is single-thread version
ajaxhe@bbs:~/program/thread$ gcc weakDefined.c -lpthread -o pt
ajaxhe@bbs:~/program/thread$ ./pt
This is multi-thread version

参考阅读:《程序员自我修养》3.5小节