码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-04-25 17:20:03      阅读:61      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!