博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
弱符号与强符号,弱引用与强引用
阅读量:6950 次
发布时间:2019-06-27

本文共 962 字,大约阅读时间需要 3 分钟。

1.弱符号与强符号

对C/C++而言,编译器默认函数和初始化了的全局变量为强符号。未初始化的全局变量为弱符号。此处弱符号与强符号均是针对定义来说的,不是针对符号的引用。也可以通过GCC的 “__attribute__((weak))”来定义任何一个强符号为弱符号。

 

[cpp] 
 
  1. extern in ext;  
  2. int weak;  
  3. int strong = 1;  
  4. __attribute__((weak)) int weak2 = 1;  
  5.   
  6. int main()  
  7. {  
  8.     return 0;  
  9. }  

其中,强符号为:strong 与 main,弱符号为 :weak 与 weak2,而ext 即非强符号与非弱符号,因为它是一个外部变量的引用。针对强弱符号,链接器会根据下述规则来选择被多次定义的全局符号:

1.不允许强符号被多次定义。否则链接器报错:符号重复定义

2.如果符号在某个文件中是强符号,在其他文件中是弱符号,则选择强符号

3.如果一个符号在所有文件中都是弱符号,则选择其中占用空间最大的。如弱符号 weak 在 A 文件中定义为double,在文件B中定义为 int, 则在链接A,B时,weak 的大小为 double的大小。

 

2.弱引用与强引用

强引用:目标文件引用了外部符号,在链接时若未找到定义则报错;则对该外部符号的引用为强引用

弱引用:目标文件引用了外部符号,在链接时若未找到定义也不报错;则对该外部符号的引用为弱引用。

对弱引用,编译器一般默认其值为0,在GCC中,使用“__attribute__((weak))”来声明对一个外部符号的引用为弱引用。通常对弱引用的使用方式如下:

 

[cpp] 
 
  1. __attribute__((weak)) void func();  
  2.   
  3. int main()  
  4. {  
  5.       if(foo) foo();  
  6. }  

 

3.弱符号与弱引用的作用:

如:库中定义的弱符号可以被用户定义的强符号覆盖,从而使程序可以使用自己定义版本的库函数

如:库中定义的某些扩展功能模块的引用定义为弱引用,当我们将扩展模块与程序链接在一起时,正常运行;当我们去掉某些扩展模块时,程序也正常链接,只是缺少了相应功能

 

http://blog.csdn.net/virtual_func/article/details/48554379

你可能感兴趣的文章
【Error】IOError: [Errno 22] invalid mode
查看>>
repmgr学习记录(搭建主从复制)
查看>>
BinaryFormatter探讨
查看>>
用keras 和 tensorflow 构建手写字识别神经网路
查看>>
HDU 4101 Ali and Baba
查看>>
民意调查Django实现(三)
查看>>
[2018-01-13] 安装Django的一些笔记
查看>>
SQL Server 高性能写入的一些总结
查看>>
有关T-SQL的10个好习惯
查看>>
关于c语言面试题--宏定义1.2
查看>>
Node之http填坑(2)
查看>>
计算机英语.net 后端
查看>>
Win7 Wifi和安卓端连接
查看>>
javascript学习笔记10-13章
查看>>
Python实战之Oracle数据库操作
查看>>
node读取文件转换json文件
查看>>
php网址显示excel表格内容
查看>>
HDU - 1874 畅通工程续(迪杰斯特拉)
查看>>
线段树 适合初学者
查看>>
go语言中的文件创建,写入,读取,删除
查看>>