Never say die!
2014年(31)
分类: C/C++
2014-05-14 18:29:47
目录:
1、变量存储类型
特别注意: 1)局部变量默认是自动auto存储,可以省略不写;
2)register寄存器存储,速度很快,目前用的不多;
3)static位于静态存储区,既可以声明局部变量也可以声明全局变量,如果声明的全局变量只能作用与本文件,这也是static的好处,可以避免一些全局变量不被其它文件使用,但可以被本文件的其他函数使用;另外static声明的变量空间自动赋初值0,但对于自动存储类型声明变量如果没有初始化值,则会被系统任意给一个随机值;
局部变量:也即是在函数内定义的变量,每次函数调用时赋初值,调用后释放;
全局变量:也即是在函数外定义的变量,只是在编译时赋值,只赋值一次,不会被释放,也即值有延续性;
总结:
a) static既可以声明全局变量也可以声明局部变量,都存储在静态存储区;
b) 在函数体定义的一个变量(局部变量),该局部变量分配到栈内存,调用函数体结束后,系统就 会收回栈内存,则该局部变量相应失效,也即被丢弃掉;
但有时候我们需要在两次调用之间对变量的值进行保存,通常的想法是定义一个全局变量来实 现。但这个变量已经是局部变量,若让其具有全局变量特性,就需要借助static;
c) static声明的静态局部变量保存在全局数据区,而不是栈中,每次的值保持到下次的值调用,作 为其下次的初值;
4)extern关键字的作用是声明变量和函数为外部链接,即该变量或函数名在其它文件中可见。
用其声明该变量或函数在别的源文件已经定义过。
eg: extern int a;
仅仅是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间。变量a在所有模块中作为一 种全局变量只能被定义一次,否则会出现连接错误,多为重定义错误;
总结:在同一个工程下的相关联文件,有一个文件定义了全局变量或函数,全局变量可以被其它文件 访问使用,但需要借助extern申明一下如:extern int x,y; 而不是定义,如果是定义就 重复了会连接出错;且可以声明成全局或局部变量,若声明成全局变量可以被该文件下的所有 函数使用;但记住这个全局变量是其它文件定义的,本文件只是申明引用一下;
注:声明变量的extern关键字一定不能省略;
若引用其它文件的子函数,用extern申明一下,如:extern void fun();
此时这个extern关键字可以省略,一般最好不要省略,不然不好区分是定义的还是申明的;
5) 声明与定义的区别
函数或变量在声明时,并没有给它实际的物理内存空间,它有时候可以保证你的程序编译通过, 但是当函 数或变量定义的时候,它就在内存中有了实际的物理空间,如果你在编译模块中引用的外部变量没有在整个 工程中任何一个地方定义的话, 那么即使它在编译时可以通过,在连接时也会报错,因为程序在内存中找 不到这个变量!你也可以这样理解, 对同一个变量或函数的声明可以有多次,而定义只能有一次!
1.cpp如下: 2.cpp如下:
int x,y; extern int x,y;
extern void PrintHello(); void PrintHello()
void Func1() {
{ cout<<"hello!"<
x=123; }
} void Func2()
int main() {
{ y=x*10;
PrintHello(); }
......
}
在2.cpp中使用extern int x,y;只是声明了x,y这两个变量,它告诉编译器其后的变量已经在别的文件中说明,不再 为它们分配 内存。当两个文件都编译成为.obj后,连接时所有的外部变量和函数都得到统一,可以共享各自定义的全局 变量和函数。
在1.cpp中使用extern void PrintHello(); 声明了引用其它文件的一个子函数;