您的位置:首页 > 其它

作用域、链接属性、存储类型总结

2014-04-01 00:32 281 查看
1,作用域:有4种不同类型的作用域--文件作用域、函数作用域、代码块作用域和原型作用域。



2,标识符声明的位置决定它的作用域。



3,任何在所有代码块之外声明的标识符都具有文件作用域。它表示这些标识符从它们的声明之处直到它所在的源文件结尾处都是可以访问的。由于函数名本身并不属于任何代码块,因此文件中定义的函数名也具有文件作用域。



3,链接属性:有3种--external、internal、none。没有链接属性的标识符(none)总是被当做单独的个体,即该标识符的多个声明被当做独立不同的实体。

属于internal链接属性的标识符在同一源文件内的所有声明中都指同一个实体,但位于不同源文件的多个声明则分属不同实体。

属于external链接属性的标识符不论声明多少次、位于几个源文件都表示同一个实体。



4,关键字extern和static用于在声明中修改标识符的链接属性。



5,static只对缺省链接属性为external的声明才有改变链接属性的效果。当它用于函数定义时,或用于代码块之外的变量声明时,static关键字用于修改标识符的链接属性,从external改为internal,但标识符的存储类型和作用域不受影响。用这种方式声明的函数或变量只能在声明它们的源文件中访问。当它用于代码块内部的变量声明时,static关键字用于修改变量的存储类型,从自动变量修改为静态变量,但变量的链接属性和作用域不受影响。用这种方式声明的变量在程序执行之前创建,并在程序的整个执行期间一直存在。函数的形式参数不能声明为静态,因为实参总是在堆栈中传递给函数,用于支持递归。



6,extern关键字用于文件作用域的声明时,是可选的。当它用于源文件中一个标识符的第一次声明时,它指定该标识符具有external链接属性,但是,如果它用于该标识符的第二次或以后的声明时,它并不会更改由第一次声名所指定的链接属性。

eg:

1->static int i;

int func()

{

2-> int j;

3-> extern int k;

4-> extern int i;

...

}

声明4并不修改由声明1所指定的变量i的链接属性。i还是内部的链接属性。

只要变量并非声明于代码块或函数定义内部,它在缺省情况下的链接属性就是external。而具有external链接属性的实体也被称为全局global实体,所有源文件的所有函数均可以访问它。如果一个变量声明于代码块内部,在它前面添加extern关键字将使这个代码块所引用的是全局变量而非局部变量。

具有external链接属性的实体总是具有静态存储类型。



7,存储类型:有三个地方可以用于存储变量:普通内存、运行时堆栈、硬件寄存器。



8,变量的缺省存储类型取决于它的声明位置。凡是在任何代码块之外声明的变量总是存储于静态内存中,这类变量称为静态static变量。对于这类变量,你无法为它们指定其他存储类型。静态变量在程序运行之前创建,在程序的整个执行期间始终存在。



9,在代码块内部声明的变量的缺省存储类型是自动的(automatic),它存储于堆栈中,称为自动(auto)变量。有一个关键字auto就是用于修饰这种存储类型的,但它极少使用,因为代码块中的变量在缺省情况下就是自动变量。在程序执行到声明自动变量的代码块时,自动变量才被创建,当程序的执行流离开该代码时,这些自动变量便自行销毁。



10,在代码块内部声明的变量,如果给它加上关键字static,可以使它的存储类型变为静态。注意,修改变量的存储类型并不表示修改该变量的作用域。函数的形式参数不能声明为静态,因为实参总是在堆栈中传递给函数,用于支持递归。



11,因为局部变量不具有链接属性,所以它们不能再函数的外部通过名字访问,这就是它们称为局部变量的原因。



12,代码总是存储于静态内存中的。



13,除了实体的具体定义位置之外,在它的其他声明位置都使用extern关键字。

14,源文件a的一个链接属性为external的变量,如果要在源文件b中使用,还是要先声明才可以在源文件b中使用的。

-------以上内容摘自《C和指针》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: