C\C++语言细节(2)
C\C++ : auto register extern static 的作用????
对于一个完整的程序,在内存中的分布情况如下图:
代码区 //low address
全局数据区
堆区// new /malloc 动态分配的位子,,也就是内存中未被使用的那部分内存
栈区 //high address(局部变量)
auto register 都是定义局部变量的,auto int a 和 int a,无差异,不过最近填了一个新功能(可推断类型):auto a=10;知道a=int a=10;(VS2010,codeblocks)
编译---》链接(extern 表示定义在别个文件中)
A.cpp{ int i; main{}} B.cpp{int i;main(){}}
编译的时候不会报错,全局变量在编译的时候不透明,
而在链接的时候,会发现有两个i,报错
A.cpp{ main{i;}} B.cpp{int i;main(){}}
在A中不声明,直接当成用B中的全局变量i,
在编译的时候就会出错(编译阶段不透明)
办法:
extern:
A.cpp{ extern int i; main{}} B.cpp{int i;main(){}}
static:更麻烦,
static int i ;静态全局变量,全局变量区,
定义全局变量就可以实现变量在文件中的共享
静态全局变量不能被其它文件所用;
int i; 默认动态全局变量,
静态局部变量:在函数的内部定义,但是还是在全局数据区分配内存:
int f(){static int n=1;n++;cout<<n;}
main(){f();f();f();} 第一次调用的时候定义,第二个就不用定义,输出:2,3,4
在类中:静态数据成员:被该类的所有对象所共享
静态成员函数只能访问静态数据成员和函数
extern static 全局变量区,