一,变量的作用域
1,代码块作用域。声明位于一对大括号之间,有效范围从声明开始至代码块结束。
2,文件作用域。声明位于所有代码块之外,有效范围从声明开始至文件尾。
3,函数作用域。函数内有效。一般只针对goto语句所用到的标签。
4,原型作用域。只适用于函数声明的括号内。(用到比较少)
例1:
typedef char *charPtr; //文件作用域
charPtr ch_a;//文件作用域
int int_a;//文件作用域
int fun_a(int int_b);//fun_a是文件作用域,int_b是原型作用域
int main(void)
{
int int_c = 0;//代码块作用域
{
charPtr ch_c; //代码块作用域
int int_d; //代码块作用域
}
fun_a(100);
return 0;
}
int fun_a(int int_b) //int_b是代码块作用域
{
goto stop;
stop: //函数作用域。
return int_b + 1;
}
二,链接属性
1,无链接。正常的变量,多次不相互冲突的声明被当作不同的变量实体。被存储在不同的位置。
2,内部链接。同一个文件内多次声明的同名变量,指的是同一个实体。位于不同的源文件则指不同的实体。(关键字static)
3,外部链接。同一个program中不管声明几次,在几个源文件中均表示同一个实体。(关键字extern)
例2:
typedef char *charPtr;
static charPtr ch_a; //static声明将外部链接转为内部链接
extern int int_a; //声明int_a在其他文件中定义,表示int_a是外部链接。
int int_b; //外部链接,可以在外部源文件中用extern声明。
int fun_a(int int_c); //外部链接
int main(void)
{
int int_d = 0; //无链接
{
charPtr ch_c; //无链接
int int_e; //无链接
}
fun_a(100);
extern int int_f; //声明int_f在其他文件中定义。
static int int_g; //无链接,因为static只对默认为外部链接的变量有效。
return 0;
}
int fun_a(int int_c)
{
return int_c + 1;
}
三,存储类型
1,静态内存。程序运行之前创建,程序运行过程中一直存在。并且始终保持原先的值。(用static修饰)
2,运行时堆栈。程序执行到声明变量的代码时创建,离开代码段时自行销毁。
3,硬件寄存器。(register)提示对应的变量应该放在机器的寄存器当中,而不是内存中。与编译器相关,不一定能够达到效果。
注:由于函数调用是实参是通过堆栈进行传递的,故函数的形参不能声明用static进行修饰。
四,static的作用
1,改变链接属性:将变量由外部链接改为内部链接,拒绝外部源文件使用该变量。如例2中的变量ch_a.
2,改变变量的存储形式。变量存储于静态内存。用于定义静态变量。保证变量在程序运行的过程中一直存在,且只会被定义一次。
注:对于在.h中定义的文件作用域的static变量sa,每一个引用该头文件的源文件都会有一个独立的变量sa。
五,C++中的static
1,类静态成员变量:
静态成员是类所有实例的公用变量,可以理解为类的作用域内的全局变量。同普通的static变量一样,在程序初始化的时候分配一次,在程序运行期间一直存在。
2,类静态成员函数
静态函数是类所有实例的公用函数,只能访问类的静态成员变量,通过类名::函数名方式调用。
3,对于类的静态成员(包括变量和函数)。在类的定义中只是声明,必须在cpp中进行初始化/实现,初始化/实现时不需要static修饰。对于类的静态成员变量程序会在启动前(main()执行前)进行初始化。