作用域
作用域用来控制标识符的有效范围。
常规
单文件的作用域有如下几种
文件作用域(全文件,在代码块之外声明,注意#include延伸了文件)
函数作用域(只适用于语句标签,配合goto,所以语句标签在函数中必须唯一)
代码块作用域(花括号范围)
原型作用域(方法原型定义时,参数不能相同)
就近覆盖
链接属性
由于结构需要,一个程序的源文件会被拆分编译。有些标识符可能在多个文件中出现重复,那么是多个文件共享一个实体还是每个文件独立拥有实体?
这时候需要引入连接属性:
external: 表示全是同一个实体
internal: 表示相同的文件中的是一个实体,不同的文件中的是不同的
none:表示全是不同的实体;函数形式参数和代码块内声明的变量在缺省情况下具有none链接属性
int b; //external
int c(){ //external
int e;//none
int f(int g); //f external(因为是函数,必然对应代码块之外的原型),
}
static
如果某个缺省声明在正常情况下具有external链接属性,static可以让他变为internal
static int b; //internal
int c(){ //external
static int e; //static has no effect
}
extern
extern 为一个标识符指定external链接属性。
标识符在源文件中第一次声明时使用extern才有效
extern int b; //如果b在别的地方有定义,extern不是必须的,但是有助于可读性
static int o;
int c(){
extern int e; //external
extern int o; //still internal
}
Last updated
Was this helpful?