关键字(externstatic)与标识符的三个属性(链接属性、作用域、存储类别)

tech2023-09-01  101

变量声明的基本形式:

说明符【一个或多个】  声明表达式列表 (static/extern/none) (static/register/auto) (数据类型) 标识符

说明符包含了一些关键字,用于描述被声明的标识符的基本类型。 说明符也可以用于改变标识符的缺省存储类型和作用域。

链接属性:

1、决定如何处理在不同文件中出现的标识符。 2、与作用域相关。 3、链接属性一般和标识符的定义和声明一起使用

类型:

internal链接属性:标识符(变量或者函数)只能在源文件使用    static 修饰的全局变量为 internal链接属性

external链接属性:标识符(变量或者函数)可以在其他源文件使用   全局变量默认都是external链接属性,external类型的标识符或函数无论声明多少次、无论位于不同源文件都表示同一个实体。

none:没有链接属性的标识符,总是被当作单独的个体,也就是说该标识符的多个声明被当作独立不同的实体。    局部变量和函数形参都是none链接属性的。

作用域

标识符的作用域就是程序中该标识符可以被使用的区域。 作用域分为四种类型:

代码块作用域

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

文件作用域

在所有代码块之外声明的标识符都具有文件作用域

原型作用域

函数原型的参数【非必须,但如果有的话】享有独立的作用域,不需要和函数定义时的形参。 原型作用域防止这些参数名与程序其他部分的名字冲突。

int add(int c, int d);// 函数声明 int add(int a, int b) //函数定义 { return a + b; }

函数作用域

语句标签,语句标签用于 goto 语句,一个函数的所有语句标签必须唯一。

存储类型

变量的存储类型是指存储变量值的内存类型。变量的存储类型觉得生命期。 关键字 auto:自动类型,存储于运行时堆栈中【运行时堆栈和数据结构上的堆栈不同】详情可点链接 static:静态变量,存储于静态区,生命期延长至程序结束,不会重复初始化。 函数形参不能设置为静态变量,否则无法放入堆栈,无法完成传参,因为传参都是从堆栈传给函数,用于支持递归 register:存储于硬件寄存器中,变量放入寄存器中访问效率会变高,但是

存储区

代码区:存储方法体的二进制代码。
静态存储区

在执行程序前分配存储空间,占据固定的存储单元。 存储全局变量、静态变量、常量,常量包括String常量。系统自动分配和回收。

动态存储区

堆 局部变量、函数返回值、形参、都存放在动态存储区,函数执行时使用,执行完释放空间,以上数据与其使用空间在函数执行前后没有必然联系。系统自动分配和回收。 栈 malloc产生的数据,由程序员分配或回收,程序结束后系统也可以回收。

最新回复(0)