您的位置:首页 > 其它

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

2014-01-13 20:05 302 查看


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

freeboy1015

3 票




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小节
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐