[原创] static, extern关键字的作用域,存储类型示例

  之前写过一篇 <从作用域 链接属性 存储类型三个方面详解 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链接属性的实体这是具有静态存储类型.

posted @ 2020-04-25 16:03  GeneWong  阅读(204)  评论(0编辑  收藏  举报