关于存储持续性,作用域,链接性,static与extern

存储持续性:变量从声明到销毁。

  自动存储持续性:自动变量(如在函数内int a;)的持续性为自动,在代码块({...}或函数内)中被创建,执行完函数或代码块后销毁,内存被释放。如在函数内(包括main)声明自动变量,则函数结束后就销毁。

  静态存储持续性:在函数外(如在main之前声明int a;另外函数内不能嵌套定义,即main中是不能再定义一个函数的)或使用static定义的变量,他们的存储持续性在程序(main)运行的整个过程中都存在,但作用域会有区别。在函数外声明的变量,他的作用域(下面讲作用域)在整个文件(main.c或fun.c)中都可用,即随处都可以使用它。而使用static声明的变量,在不同的区域作用域不同,当在函数内(如main()内)或代码段时,在这个函数内都是随处可以使用的,但在另一个函数(如在func())中是不可见不可用的。

  动态存储持续性:分配在堆中,由秃头侠们掌握生命周期(或直到进程死亡)。

作用域与链接性:这两个概念有点相似。

  作用域:只用来形容在文件内(如main.cpp或a.cpp)中的作用范围。分为全局作用域和局部作用域。

      作用域只用于形容在一个文件内的范围,前面说的静态变量(在函数外或static声明这两种方式)中,函数外的为全局作用域,而static当声明在代码段或函数内则为局部作用域。

  链接性:用于形容在文件间(如在main.cpp与a.cpp间)的作用范围。分为外部链接性,内部链接性和无链接性。

      链接性用于形容在不同文件间的作用范围。前面说的静态变量中,在函数外声明的变量,他的链接性为外部链接性(作用域为全局),即当在main.cpp文件的mian()外声明后,在a.cpp中可以看见和使用。而如果在函数外部,但使用static声明的变量,他的链接性为内部链接性,即只可在本文件中访问(他的作用域也为全局的)。而如果在函数内部用static声明的静态变量,他的链接性为无,即只可在函数内使用(他的作用域为局部)。

  static与作用域的组合产生的链接性:

    无static+全局=外部链接性

    static+全局=内部链接性

    static+局部=无链接性

extern的使用: 

    extern适用于外部变量,即链接性为外部链接性的变量,即无static+全局作用域。extern主要用于引用外部变量,如在a.cpp中定义了一个外部变量sb,则在main.cpp中要使用它时使用extern sb;  来说明。另外在main.cpp中引用sb也需要注意作用域,如在一个代码段中引用,则在代码段外仍不可用与不可见。在函数外引用则全局作用域内都可使用。在定义外部变量时,extern是可以省略的,但引用时不可省略,如在a.cpp中函数外int sb=100;这里可以省略,但在mian.cpp中引用时必须加入关键字extern。

  

  

猜你喜欢

转载自www.cnblogs.com/lxy-xf/p/10986341.html