弱符号与强符号,弱引用与强引用
来源:互联网 发布:仅限数据连接怎么取消 编辑:程序博客网 时间:2024/04/30 17:20
1.弱符号与强符号
对C/C++而言,编译器默认函数和初始化了的全局变量为强符号。未初始化的全局变量为弱符号。此处弱符号与强符号均是针对定义来说的,不是针对符号的引用。也可以通过GCC的 “__attribute__((weak))”来定义任何一个强符号为弱符号。
extern in ext;int weak;int strong = 1;__attribute__((weak)) int weak2 = 1;int main(){ return 0;}
其中,强符号为:strong 与 main,弱符号为 :weak 与 weak2,而ext 即非强符号与非弱符号,因为它是一个外部变量的引用。针对强弱符号,链接器会根据下述规则来选择被多次定义的全局符号:
1.不允许强符号被多次定义。否则链接器报错:符号重复定义
2.如果符号在某个文件中是强符号,在其他文件中是弱符号,则选择强符号
3.如果一个符号在所有文件中都是弱符号,则选择其中占用空间最大的。如弱符号 weak 在 A 文件中定义为double,在文件B中定义为 int, 则在链接A,B时,weak 的大小为 double的大小。
2.弱引用与强引用
强引用:目标文件引用了外部符号,在链接时若未找到定义则报错;则对该外部符号的引用为强引用
弱引用:目标文件引用了外部符号,在链接时若未找到定义也不报错;则对该外部符号的引用为弱引用。
对弱引用,编译器一般默认其值为0,在GCC中,使用“__attribute__((weak))”来声明对一个外部符号的引用为弱引用。通常对弱引用的使用方式如下:
__attribute__((weak)) void func();int main(){ if(foo) foo();}
3.弱符号与弱引用的作用:
如:库中定义的弱符号可以被用户定义的强符号覆盖,从而使程序可以使用自己定义版本的库函数
如:库中定义的某些扩展功能模块的引用定义为弱引用,当我们将扩展模块与程序链接在一起时,正常运行;当我们去掉某些扩展模块时,程序也正常链接,只是缺少了相应功能
1 0
- 弱符号与强符号,弱引用与强引用
- C语言中的弱符号与强符号,强引用与弱引用
- 弱符号与强符号
- 弱符号与强符号
- 弱符号与强符号
- 弱符号与强符号
- 强符号与弱符号
- 强引用与弱引用
- 强引用与弱引用
- GCC中的弱符号与强符号
- 弱符号与强符号概念
- 弱符号与强符号概念
- 弱符号与强符号概念
- 弱符号与强符号概念
- 全局变量与强符号和弱符号
- GCC中的弱符号与强符号
- 浅谈C语言中的强符号、弱符号、强引用和弱引用
- 关于C语言中的强符号、弱符号、强引用和弱引用
- HDU 5446 Unknown Treasure
- 用到Bitmap(位图,显示图片)、compress(压缩并保存图片)、自定义更换背景图的范例
- Volley 信任自签名的 Https 证书
- iOS9 添加定位功能后,启动应用没有出现允许开启定位权限的通知,或者出现权限通知后,自动消失的解决办法 - 家柱
- Java中快捷键的使用、
- 弱符号与强符号,弱引用与强引用
- centos 源代码安装nginx
- 大数运算,HDNOJ——1002 A + B Problem II
- Android自定义View---Canvas绘制贝塞尔曲线
- SQL Server - 数据库初识
- 黑马程序员-------正则表达式
- 我的错误
- hdu 1083 Courses(二分匹配之匈牙利算法)
- 在Ubuntu上安装PPTP VPN服务