课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > Strong Symbol 和 Weak Symbol用法浅析
  • Strong Symbol 和 Weak Symbol用法浅析

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

  • 昆明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--零基础全日制班

Java--零基础全日制班

开班日期:11/30

Java--零基础业余班

Java--零基础业余班

开班日期:11/30

Java--周末提升班

Java--周末提升班

开班日期:11/30

Java--零基础周末班

Java--零基础周末班

开班日期:11/30

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56