作用域

当变量在程序的某个部分被声明的时候,他只有在程序的一定渔区才能被访问,编译器可以确认4种不同类型的作用域:文件作用域,函数作用域,代码块作用域和原型作用域

1.代码块作用域:位于一对花括号之间的所有语句称为一个代码块.任何在代码块的开始位置声明的标识符都具有代码块作用域,表示他可以被这个代码块中的所有语句访问.(例子中:f,g函数,i)

2.文件作用域:任何在所有代码块之外声明的标识符都具有文件作用域,他表示这些标识符从他们的声明之处直到他所在的源文件结尾处都是可以访问的.(例子中:a,b)

3.原型作用域:原型作用域只适用于在函数原型中声明的参数名.(例子中:c,h)

4.函数作用域:表示一个函数中的作用域.

例子:

int a;

int b(int c);

int d (int e){

  int f:

  int g(int h);

  ...

  {

    int f,g,i;

  }

  {

    int i;

  }

}

链接属性
   当组成一个程序的各个源文件分别被编译之后,所有的目标文件以及那些从一个或者多个函数库中引用的函数链接在一起,形成可执行程序,如果相同的标识符出现在几个不同的源文件中.标识符的链接属性决定如何处理这些标识符.

链接属性一共有三种:external(外部),internal(内部)和none(无).

1.none:没有链接属性的标识符(none)总是被当做单独的个体.

2.internal:标识符在同一个源文件内的所有声明都指同一个实体,但位于不同源文件的多个声明则分属于不同实体

3.external:标识符不论声明多少次,位于几个源文件都表示同一个实体.

例子:

typedef char *a;

int b;

int c(int d){

  int e;

  int f(int g);

}

默认情况下:b,c,f的链接属性为external,其余标识符为none.

关键字extern和static用于在声明中修改标识符的链接属性.如果在默认是external属性前加上static,可以使他的属性变为internal.

比如上述 static int b;和static int c(int d)就变成这个源文件私有,不能被其他文件访问.

static只对默认属性为external的声明才有效果,对默认是none的效果完全不一样.

extern可以吧none属性的标识符变为external属性.

比如上述extern int e修改之后可以使用其他源文件的e标识符

存储类型

在程序中,变量存储类型决定他何时创建,何时销毁,以及他的值保持多久.有三个地方可以用于存储变量:普通内存,运行时堆栈,硬件寄存器.

普通内存:凡是在任何代码块之外声明的变量总是存储于静态内存中.这类变量称为静态变量,这类变量在程序启动时创建,终止时销毁.

运行时堆栈:在代码块内部声明的变量的默认存储类型是自动的,称为自动变量.如果在代码块内部声明的变量前面加上static,这个变量的存储类型就改变为静态,程序运行中一直存在

硬件寄存器:使用关键字register声明的变量表示寄存器变量,保存在硬件的寄存器中.他只能对自动变量声明

C语言中的作用域,链接属性和存储类型的更多相关文章

  1. C和C指针小记(六)-基本声明、指针声明、typedef 、常量、作用域、链接属性、存储类型、static

    1.变量的声明 声明变量的基本形式: 说明符号(一个或者多个) 声明表达式列表 说明符 (specifier) 包含一些关键字,用于描述被声明的标识符的基本类型,它也可用户改变标识符的缺省存储类型和作 ...

  2. C语言作用域、链接属性和存储类型

    C/C++中作用域详解 作用域 编译器可以确认的4种作用域-代码块作用域.文件作用域.函数作用域和原型作用域,一般来说,标识符(包括变量名和函数名)声明的位置决定它的作用域. (1)代码块作用域 一对 ...

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

    在进入正题前我们必须了解一些概念: 标识符:标识符不仅仅代表着变量的名字,main()函数的main也是一个标识符,这点很重要. 存储类型:即变量的存储位置及其生存周期:静态区:分为两块 .date ...

  4. C语言中的作用域、链接属性与存储属性

    C语言中的作用域.链接属性与存储属性 一.作用域(scope) 代码块作用域 表示{}之间的区域,下例所示,a可以在不同的代码块里面定义. #include<stdio.h> int ma ...

  5. Go 语言中的数组是一种 值类型(不像 C/C++ 中是指向首元素的指针)

    the-way-to-go_ZH_CN/07.1.md at master · Unknwon/the-way-to-go_ZH_CN https://github.com/Unknwon/the-w ...

  6. 在动态sql的使用where时,if标签判断中,如果实体类中的某一个属性是String类型,那么就可以这样来判断连接语句:

    在动态sql的使用where时,if标签判断中,如果实体类中的某一个属性是String类型,那么就可以这样来判断连接语句: 如果是String类型的字符串进行判空的时候: <if test=&q ...

  7. C/C++语言中变量作用域:局部变量,全局变量,文件级变量

    C/C++语言中的变量分为全局变量和局部变量. 这样的划分方式的根据是变量的可见范围或者叫做作用域. 1 局部变量 局部变量指的是定义在{}中的变量,其作用域也在这个范围内.尽管常见的局部变量都是定义 ...

  8. 在Delphi中调用"数据链接属性"对话框设置ConnectionString

    项目需要使用"数据链接属性"对话框来设置ConnectionString,查阅了一些资料,解决办法如下: 1.Delphi 在Delphi中比较简单,步骤如下: 方法1: use ...

  9. Go 语言中的方法,接口和嵌入类型

    https://studygolang.com/articles/1113 概述 在 Go 语言中,如果一个结构体和一个嵌入字段同时实现了相同的接口会发生什么呢?我们猜一下,可能有两个问题: 编译器会 ...

随机推荐

  1. JS之event flow

    DOM事件流 1.定义: DOM(文档对象模型)结构是一个树型结构,当一个HTML元素产生一个事件时,该事件会在元素节点与根结点之间的路径传播,路径所经过的结点都会收到该事件,这个传播过程可称为DOM ...

  2. .net core 使用 ef core

    第一步: 创建一个.net core console app. 第二步:安装EFCore package 和  design(以前vs是有EF项目模板的,core版本现在没有,所有安装这个工具来创建M ...

  3. PHP 第三方支付

    以前事情比较繁忙,压根都没有时间去整理最近的工作. 最近稍微轻松点,就把自己在公司处理的支付业务拿出来,留个纪念,顺道回顾下以前自己支付的知识. 俗话说实践是检验整理的唯一标准,东西做的是否能用,只能 ...

  4. Python编程高级特性--迭代器

    一.简单介绍 直接作用于for循环的数据类型有以下几种: 集合数据类型: list 例如:list = ["yuhaohao", "lisheng", &quo ...

  5. 新建虚拟机并与XShell连接(配置网卡)

    新建虚拟机并与XShell连接 一.新建虚拟机 下一步 下一步 选择CentOS版本,我的CentOS镜像是6.5版本64位,所以我选择CentOS 6 64. 然后点击下一步 可以自行更改位置,然后 ...

  6. C# ComboBoxTree控件

    这个控件,百度.codeproject等,能查到更好的解答和代码.写这个,是因为,我在3个小时内,没有看懂接手项目,原有的TreeCombox自定义代码逻辑.而我觉得很有必要改动它.因为新弄得网页端很 ...

  7. 神州数码多区域OSPF配置

    实验要求:掌握多区域OSPF配置 拓扑如下 R1 enable 进入特权模式 config 进入全局模式 hostname R1 修改名称 interface s0/1 进入端口 ip address ...

  8. ecmall 学习记录3

    1.在ecmall.php 中 336行有一个函数 function lang_file($file) { return ROOT_PATH . '/languages/' . LANG . '/' ...

  9. ffmpeg 视频 转 gif

    将视频 MP4 转化为 GIF ffmpeg -i small.mp4 small.gif 转化视频中的一部分为 GIF ffmpeg -t -ss :: -i small.webm small-cl ...

  10. mysql建表规范及注意事项

    表设计规范 1.库名,表名,字段名必须使用小写字母,“-”分割 ,长度不得超过12字符 , 要见名识意 : 2.建议使用Innodb存储引擎 (1)什么是存储引擎 不同的技术及配套的相关功能就是存储引 ...