昆明java培训
达内昆明广州春城路

18487146383

热门课程

Strong Symbol 和 Weak Symbol用法浅析

  • 时间:2016-01-22
  • 发布:昆明Java培训
  • 来源:达内新闻

昆明java培训班小伙伴在运行程序的时候发现,Compiler会把已经初始化的Global varible当作Strong Symbol。

未初始化的Global varible为Weak Symbol,我们可以使用GCC提供的 "__attribute__((weak))"来定义任意一个Strong Symbol为Weak Symbol

以下是昆明java培训班小伙伴分享的一个例子:

extern int ext;

int weak;

int strong = 1;

__attribute__((weak)) weak2 = 2;

int main(){

return 0;

}

在这个例子中weak和weak2都是Weak Symbol

strong和main是Strong Symbol

ext不是Strong也不是Weak,因为他是一个外部变量

昆明java培训

Compiler会按照下列规则处理Strong以及Weak Symbol

Rule1: Strong Symbol不能在不同的Obj档被多次定义

这就是昆明java培训机构老师常常看到的重复定义错误

Rule2: 如果一个Symbol在某个文件是Strong,在其他文件都是Weak

Compiler会选择Strong Symbol

Rule3: 如果一个Symbol在每个文件都是Weak,会选择最大的Type

比如说一个同样名称的int和double global varible

Compiler在Link的时候会选择double

外部符号的Reference也有分两种

Strong Reference: 在Link时找不到符号定义会回报错误

Weak Reference: 在Link时找不到符号定义不会回报错误,通常会默认为0

下面是GCC把foo()声明成weak reference的扩充keyword

__attribute__((weakref)) void foo();

int main()

{

foo();

}

上面这段代码可以编译成执行档且不会产生错误

但是我们执行程序的话,因为没有定义foo(),foo的位置为0

因此会发生不合法的位置存取错误

Weak Symbol和 Weak Reference对函数库的设计非常有用

函数库可以定义一些Weak Symbol的函数

用户可以自己定义一些Strong Symbol达到扩充功能

因为Strong Symbol会盖掉Weak Symobl

我们也可以通过Weak Reference使用一些扩充功能

以后就算我们把扩充功能去掉,程序还是可以正常Link。

昆明java培训班的小伙伴关于这个问题还有没有解决的要及时向老师询问,不耻下问这样才能学到知识。

上一篇:如何在method里面一次传递两个值
下一篇:【java.lang包下】异常解决方案

昆明java培训教你实现JSP页面跳转简易方法,120天后月薪过万

昆明Java培训告诉你java和大数据和互联网发展中起什么作用

昆明java培训:初学者学Java Script 5个小技巧

昆明java培训多久可以学会?120天教你成为java开发大神!

选择城市和中心
贵州省

广西省

海南省

扫一扫

了解更多干货