标签:extern htm 函数 其他 括号 程序 消失 运行 文件访问
之前写过一篇 <从作用域 链接属性 存储类型三个方面详解 static & extern关键字>, 此篇是对前篇的提炼, 并加了新的感悟.
最最常见的作用域有两种: 函数体内即花括号(包括函数定义中的形参)中声明的标识符和函数体外(不在任何花括号)中声明的标识符. 这两种常见的作用域标识符又各自对应不同的缺省存储类型, 任何代码块之外的(文件作用域)的标识符, 缺省存储于静态内存中,
被称作静态变量, 具有external链接属性 相反的, 代码块作用域的变量缺省存储在堆栈中, 是自动变量, 链接属性为none
静态变量先于函数执行创建, 默认初始化为0, 而自动变量在运行时创建, 运行结束, 自动变量消失, 而静态变量依然存在. 通过static可以将存储类型从自动变静态, 即整个程序执行过程中一直存在(比如被调函数结束后, 静态变量依然存在), 但作用域并未改变.
链接属性有3种:
external: 全部文件的全部声明表示同一实体(变量);
internal: 同一文件全部声明表示同一实体(变量), 不同文件表示不同实体(变量);
none: 任何一个声明均代表一个实体(变量)
int a = 5; (extern) int b;//具有文件作用域的静态变量, 默认初始化为0, 链接属性external, ‘extern‘关键字可选 static int c; //与b相同, static将external变为internal, 即本文件私有 int d(int e){ int f = 15.0; register int b; static int g=20;//static 将存储由auto改为static; g默认链接属性为none, static只作用于external extern int a; //与int a=5;重复 { int e; int a; extern int h;//声明为external属性, 表示定义在其他地方的静态变量 } { int x; int e; } return 0; } static int i(){}//static将函数名的链接属性改为internal, 外部文件无法调用i()
变量类型 | 声明的位置 | 存储位置 | 作用域 | static修饰 |
全局 | 所以代码块之外 | 静态内存 | 声明处至文件尾 | 不允许外部文件访问 |
局部 | 代码块内起始处 | 堆栈 | 整个代码块 | 存储至静态内存 |
形参(函数定义) | 函数头部 | 堆栈 | 整个函数 | 不允许 |
具有external链接属性的实体可被称为全局(global)实体, 可被所有源文件访问. 只要变量声明在所有代码块之外, 默认external, 对于代码块内部的声明, extern关键字使它可以引用全局变量.
具有external链接属性的实体这是具有静态存储类型.
[原创] static, extern关键字的作用域,存储类型示例
标签:extern htm 函数 其他 括号 程序 消失 运行 文件访问
原文地址:https://www.cnblogs.com/wj742421292/p/12773456.html