作用域、链接属性、存储类型、static 关键字简介及总结

版权声明:原创,还是不要转载了吧,如果忍不住要转载,就一定要注明地址哦! https://blog.csdn.net/Reborn_Lee/article/details/82085049

目录

 

作用域

代码块作用域

文件作用域

原型作用域

函数作用域

链接属性

存储类型

总结


作用域

当变量在程序中的某个部分被声明时,它只有在程序的一定区域才能被访问。这个区域由标识符的作用域(scope)决定。标识符的作用域就是程序中该标识符可以被使用的区域。例如,函数的局部变量的作用域局限于该函数的函数体。

编译器可以确认4种不同类型的作用域:文件作用域、函数作用域、代码块作用域和原型作用域。

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

代码块作用域

位于一对花括号之间的所有语句称为一个代码块。

任何在代码块的开始位置声明的标识符都具有代码块作用域(block scope),表示它们可以被这个代码块中的所有语句访问。

文件作用域

任何在所有代码块之外声明的标识符都具有文件作用域(file scope),它表示这些标识符从它们声明之处直到它所在的源文件结尾都是可以访问的。

在头文件中编写并通过#include 指令包含到其他文件中的声明就好像它们是直接写在那些文件中一样。它们的作用域并不局限于头文件的文件尾。

原型作用域

何为函数原型,就是函数的声明,它与函数定义不同。

原型作用域(prototype)只适用于在函数原型中声明的参数名。在原型中,参数的名字并非必需。但是,如果出现参数名,你可以随意给它们取任何名字,它们不必与函数定义中的形参名匹配,也不必与函数实际调用时所传递的实参名匹配。原型作用域防止这些参数名与程序中其他部分的名字冲突。事实上,唯一可能出现的冲突就是在同一个原型中不止一次地使用同一个名字。

函数作用域

涉及goto语句,“c和指针” 这本书这么说的,它只适合于语句标签,语句标签用于goto语句。基本上,函数作用域可以简化为一条规则:一个函数中的所有语句标签必须唯一。

并希望永远不要用到这个知识。(可见,有点可怕。)

链接属性

这块就不写了,直接看别人的博文:C语言 三种链接属性(external、internal、none)的浅析

存储类型

对C语言中的四种存储类别的理解

【C语言学习】存储类型

C语言存储类型


总结

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

具有external 链接属性的实体总是具有静态(static)存储类型。全局变量在程序开始执行前创建,并在程序整个执行过程中始终存在。从属于函数的局部变量在函数开始执行时创建,在函数执行完毕后销毁,但用于执行函数的机器指令在程序的生命期内一直存在。

局部变量由函数内部使用,不能被其他函数通过名字引用。它在缺省情况下的存储类型为auto,这是基于两个原因:

其一:当这些变量需要时才为它们分配存储,这样可以减少内存的总需求量。

其二:在堆栈上为它们分配存储可以有效实现递归。

如果你觉得让变量的值在函数的多次调用中始终保持原先的值非常重要的话,你可以修改它的存储类型,把它从自动变量改为静态变量。

下表对上述信息进行总结:

变量类型 声明的位置 是否存于堆栈 作用域 如果声明为静态(static)
全局 所有代码块之外 从声明处到文件尾 不允许从其他源文件访问
局部 代码块起始处 (1) 整个代码块(2) 变量不存储于堆栈中,它的值在程序整个执行期一直保持
形式参数 函数头部 (1) 整个函数(2) 不允许

注:

下面对上表中的(1)(2)进行补充说明。

(1)并非存储于堆栈中的变量在程序开始执行时创建,并在整个程序执行期间一直保持它们的值,不管它们是全局变量还是局部变量;

(2)有一个例外,就是在嵌套的代码块中分别声明了相同名字的变量。

猜你喜欢

转载自blog.csdn.net/Reborn_Lee/article/details/82085049