鱼C论坛

 找回密码
 立即注册
查看: 2712|回复: 0

[技术交流] 《带你学C带你飞》第三十二讲:作用域和链接属性

[复制链接]
发表于 2018-3-27 11:03:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 shuiyu 于 2018-3-27 11:06 编辑

越努力,越幸运。欢迎大家来看我的笔记,不对的或者感觉有不对的都请您指出,我一定会积极纠正的,谢谢

一、作用域
(1)上一讲我们是从变量的作用域角度将变量划分为局部变量和全局变量,这是从空间的角度来分析的。我们发现当变量被定义在程序的不同位置时,它的作用范围是不一样的。这个作用范围就是我们所说的作用域。

(2)C 语言编译器可以确认 4 种不同类型的作用域:代码块作用域、文件作用域、原型作用域和函数作用域。

二、四种作用域
(1)代码块作用域(block scope):最常见的就是代码块作用域。所谓代码块,就是位于一对花括号之间的所有语句。(也就是说它的作用范围只是在一对花括号之间)

(2)文件作用域(file scope)
任何在代码块之外声明的标识符都具有文件作用域,作用范围是从它们的声明位置开始,到文件的结尾处都是可以访问的。另外,函数名也具有文件作用域,因为函数名本身也是在代码块之外(即下图中的全局变量count)。
1.PNG


(3)原型作用域(prototype scope)
原型作用域只适用于那些在函数原型中声明的参数名。我们知道函数在声明的时候可以不写参数的名字(但参数类型是必须要写上的),其实多尝试你还可以发现,函数原型的参数名还可以随便写一个名字,不必与形式参数相匹配(当然,这样做毫无意义)。允许你这么做,只是因为原型作用域起了作用。


(4)函数作用域(function scope)
函数作用域只适用于 goto 语句的标签,作用将 goto 语句的标签限制在同一个函数内部,以及防止出现重名标签。

三、定义和声明
(1)当一个变量被定义的时候,编译器为变量申请内存空间并填充一些值。

(2)当一个变量被声明的时候,编译器就知道该变量被定义在其他地方,声明通知编译器该变量名及相关的类型已存在,不需要再为此申请内存空间。(简单的说就是定义是申请一个坑用来存放数据,声明就是告诉编译器说变量我定义过,你找不到它的定义也不要报错)

(3)定义只能一次,否则就叫做重复定义某个同名变量;而声明可以有很多次。
(PS:局部变量即是定义又是声明)

四、链接属性
(1)简单的来说,编译器将你的源文件变成可执行程序需要经过两个步骤:编译和链接。编译过程主要是将你写的源代码生成机器码格式的目标文件,而链接过程则是将相关的库文件添加进来(比如你在源文件中调用了 stdio 库的 printf 函数,那么在这个过程中,就把 printf 函数的代码添加进来),然后整合成一个可执行程序。(具体情况可以去:http://bbs.fishc.com/thread-78063-1-1.html

(2)在 C 语言中,链接属性一共有三种:
•external(外部的)-- 多个文件中声明的同名标识符表示同一个实体
•internal(内部的)-- 单个文件中声明的同名标识符表示同一个实体
•none(无)-- 声明的同名标识符被当作独立不同的实体(比如函数的局部变量,因为它们被当作独立不同的实体,所以不同函数间同名的局部变量并不会发生冲突)

(3)只有具备文件作用域的标识符才能拥有external或internal的链接属性。其它作用域的标识符都是none属性。

(4)默认情况下,具备文件作用域的标识符拥有 external 属性。也就是说该标识符允许跨文件访问。对于 external 属性的标识符,无论在不同文件中声明多少次,表示的都是同一个实体。

(5)使用 static 关键字可以使得原先拥有 external 属性的标识符变为 internal 属性。这里有两点需要注意:
1.使用 static 关键字修改链接属性,只对具有文件作用域的标识符生效(对于拥有其他作用域的标识符是另一种功能)
2.链接属性只能修改一次,也就是说一旦将标识符的链接属性变为 internal,就无法变回 external 了




谢谢小甲鱼带来的视频教程,感谢!!

本节结束,多谢览阅!
越努力,越幸运。欢迎大家来看我的笔记,不对的或者感觉有不对的都请您指出,我一定会积极纠正的,谢谢

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 09:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表