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

Posted wj742421292

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[原创] 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链接属性的实体这是具有静态存储类型.

以上是关于[原创] static, extern关键字的作用域,存储类型示例的主要内容,如果未能解决你的问题,请参考以下文章

15-static和extern关键字1-对函数的作用

关键字 static extern

iOS 中 const static extern 关键字总结

C语言20-static和extern关键字2-对变量的作用

关于extern和static关键字引出的一些关于作用域和链接属性和存储类型的问题

012 static和external,cosnt关键字