-
符号
符号分为以下三类:
全局符号 在此处定义,可以在其他的文件,其他的位置引用,对应于非static修饰的(局变量和函数定义)。
外部符号 在此处引用,在其他位置定义,对应于其他位置定义的变量和函数。(加extern关键字)。
本地符号 在此处定义,只在本文件中可见,其他文件不能引用。(用static修饰的全局变量和函数定义)。
-
变量重名
- 单文件中
多个同名变量存在时,本着一个原则:在程序运行过程中,在运行栈栈顶的内容(比如一个函数)中定义的变量,会隐藏其他与其同名的但不在同一栈帧的变量,变量的作用域便不难理解。(附注:相同的变量名称不是一个好的方法,只会增加理解的难度,所以不推荐刻意(为了隐藏变量)使用。)
举例如下:
1: #include <stdio.h>
2:
3: int a;
4: int b;
5:
6: void abc(void){
7: printf("%d\n",a); //此处引用全局变量a
8:
9: a =8;
10: printf("%d\n",a); //对全局变量a进行修改并输出
11:
12: int a; //此处覆盖了全局变量a的定义,在此之后对a的引用全都是引用此处声明的变量
13: a =10;
14: printf("%d\n",a);
15: } //退出函数后本地定义的a随之销毁,在此之后,对a的引用为对全局变量的引用
16:
17: int main(){
18: a=9; //修改全局变量a
19: abc();
20: printf("%d\n",a); //此处为对全局变量的引用,在abc函数中声明a后对a所做的更改并未影响全局变量
21: return 0;
22: }
23:
24: //输出结果为:
25: //9
26: //8
27: //10
28: //8
29:
-
- 多文件中全局变量重名
很多时候程序编译可以通过,但是在链接时遇到xxx符号解析错误,实在令人头疼,理解链接器解析符号的过程,有助于改正现有的错误。
解析多重定义的全局符号时,遵循以下三条原则:
- 不允许有多个强符号
- 如果有一个强符号和多个弱符号,选择强符号的定义
- 如果有多个弱符号,从这些弱符号中任意选择一个。
下面解释一下强弱符号。
强符号为函数和已初始化的全局变量。
弱符号为未初始化的全局变量
-
变量的链接属性和static用法
变量的链接属性分为三种none,internal(可以被内部引用),external(可以被外部引用).
对于每一个none链接属性的变量,每次声明对应一个单独的实体,多次声明会有多个实体出现。
对于链接属性为internal的变量,在同一个源文件中定义同属一个实体,在不同原文件中,分别属于不同的实体。
对于链接属性为external的变量,在不同源文件中定义同属于一个实体,在此处声明的变量可能在其他的文件中定义。
而static关键字修饰默认的链接属性为external的变量时,可以将该变量的链接属性改为internal,这样,可以防止在本文件中定义的变量在其他文件中的调用,减少错误使用变量的情况。