Compiler会把已经初始化的Global varible当作Strong Symbol
未初始化的Global varible为Weak Symbol,我们可以使用GCC提供的 "__attribute__((weak))"来定义任意一个Strong Symbol为Weak Symbol
以下是一个例子:
- 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,因为他是一个外部变量
Compiler会按照下列规则处理Strong以及Weak Symbol
Rule1: Strong Symbol不能在不同的Obj档被多次定义
这就是我们常常看到的重复定义错误
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
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
