static的使用,以及全局变量和局部变量
static主要有2个用法:
1)用于修饰函数定义的变量或者类成员变量,称为静态变量。静态变量存储在静态存储区,全局变量也存在与静态存储区,二者存储位置相同,但是作用范围不同。前者只能声明该变量的头文件使用,后者包含该头文件的源文件都可以使用。 外部变量(全局变量)虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量
2)用于修饰局部变量,一般局部变量不用添加static,与extern修饰的全局变量互反。未命名空间也有使变量成为局部变量的作用,每个包含未命名空间头文件的文件中,都会产生自己的实体,在C++中,未命名空间用于替换static变量的声明。
头文件中局部变量和函数的定义:
在源文件中使用static修饰定义的全局变量和全局函数,可以在多个源文件里重复,比如a.cpp和b.cpp都同时定义了static int c=0,是不会引起重复定义,因为都成为局部变量。所有非extern声明的变量都是定义,定义需要分配内存。此时static与匿名域名空间具有相同的作用。
3)static修饰类中的变量和函数:static修饰的类成员函数属于类的属性,只能调用static变量,需要在类外定义。static变量也只能在类外初始化,是类的属性,const static可以在类定义时初始化,但是也必须在类外定义一次。基类,继承类中只有一个static成员实例,如果是public成员可以通过基类或者public继承的派生类的对象访问,也可以通过类的作用域访问
const 和typedef 默认也是局部特性,所以可以在头文件中声明,但是需要定义:const是为了替换define ,前者可以进行类型检查以及只分配一次内存,不可修改值,后者简单替换,生成多次内存,并且还有限定变量不能修改等作用。const只是语法定义,不关乎内存定义,所以存在栈,还是堆,还是静态存储区看变量定义的位置
在头文件使用static修饰局部变量或者函数定义的时候,不会出现链接错误,因为这个是局部的,只有编译单元内部可见,编译单元的外部导出表是不可见的。
头文件还可以定义inline函数,因为这个是没有实体的,所以也不会出现在导出表,用于替换static修饰的函数
extern "c"的作用:
因为C++有重载功能,所以对包括定义和声明的函数名为重新命名,而C是没有这个功能的,如果在源文件使用C的库,那么重命名声明的函数名和定义的函数名不同。
所以例如使用:extren"c" {include some_c.h},意思是这个头文件变量按照C的方式编译,无需重新对函数名重新命名
static修饰类的成员函数:
此时成员属于类的性质,比如operator new和operator delete都是默认static的。静态函数都只能使用静态成员,因为静态函数可以在对象生成前使用,而此时还没有数据初始化,所以必须使用静态数据成员
浙公网安备 33010602011771号