编译器连接时的弱引用的作用是什么?
2014-01-13 20:05
302 查看
编译器连接时的弱引用的作用是什么?
freeboy10153 票
2578
最近在看《程序员的自我修养》,连接这一章中降到了强符号和弱符号、强引用和弱引用,我比较疑惑的是编译器连接时的弱引用的作用是什么?
评论 (0) • 分享 • 链接 • 2012-12-07
2个答案
票 数
__mt
7 票
3269
最佳答案
强符号和若符号的概念就不解释了,之前有很多帖子说过这个问题了
解释一下强引用和弱引用,主要从编译器的角度来说吧。假设一个强引用,给出了生命但却没给定义的时候,编译器在编译阶段就会报错。而弱引用编译的时候就不会报错。例如下面的代码
__attribute__ ((weakref)) void foo(); int main() { if (foo) foo(); }
这时foo是一个弱引用。运行时会判断。若定义了foo就调用foo,若没有定义,就不调用。这个对于程序的裁剪和组合非常有帮助。举个例子,例如你不是QQ会员,那么提供你的功能的库函数里面就不给出foo这个函数的定义,那么你就没有会员特权了。假设你是QQ会员,只需要给出一个有foo函数定义的库,那么你就可以使用会员特权了。这样不需要改代码,只需要管理一下函数就可以轻松实现,所以说这个使程序的裁剪和组合更加容易。
__mt
编辑于 2012-12-07
评论 (1) • 链接 •
2012-12-07
0
例子举得很好,谢谢! – freeboy1015 2012-12-07
ajaxhe
1 票
2876
弱引用对于库来说很有用,比如说:
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 version\n"); } else { printf("Thi is single-thread version\n"); } }
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小节
相关文章推荐
- JAVA父类引用指向子类的对象是什么意思?有什么作用?
- 每天两道oracle笔试题系列+第五天:1、用于网络连接的两个文件是什么?2、数据库的重做日志(Redo Logs)的作用?
- c++高级---C++声明、定义、类的定义、头文件作用、头文件重复引用,不具名空间以及编译器编译链接过程
- (转)写的html页面引用外部css文件的时候在IE7,IE8和FF中能正常作用,即能正常显示,可在IE6中却完全没有作用到,即css文件里的样式根本未被解析到我们的html页面,这是什么原因?
- sql中左连接是什么意思啊,有什么作用啊?能否给个例子,谢谢大家
- 引用css和js链接地址中带的问号是什么意思?有什么作用?
- array的unshift method的作用是什么?如何连接两个array
- +=符号不仅仅是连接作用
- java下Class.forName的作用是什么,为什么要使用它
- 分区索引的建立方式,作用是什么
- 什么是 值传递,地址传递和引用传递 有什么区别
- 引用与using的什么区别
- WebSocket 是什么原理?为什么可以实现持久连接?
- Python中的逗号有什么作用?
- 威老出国记,什么是引用,别名。
- 属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种情况下用?
- TCP面向连接中的“连接”究竟是什么,可靠与不可靠(转)
- SerialVersionUID是什么,有什么作用
- TensorFlow中的onehot有什么作用,为什么要使用onehot向量呢?
- oracle数据库--Oracle 左连接、右连接、全外连接、(+)号作用