chapter12学习笔记(六)
chapter12学习笔记(六)
这回我们来看看有外部链接的静态变量
Static Variable with External Linkage
一个静态变量如果拥有外部链接,那么它就有了文件作用域(file scope)以及静态存储周期(static storage duration),意味着它在程序运行期间一直存在
用专业术语,这种类型就是 external storage class,对应的变量就是external variable,要定义一个这样的外部变量,顾名思义,就是要在函数的外部来定义式地声明(defining declaration)这样一个变量
当然,你可以额外(addtionally)在函数里通过关键字extern
声明(declare)一个外部变量,这主要是为了注释,如果要引用在其他文件内定义的外部变量,则必须使用extern
关键字
额外,或是可选(optional)就意味着实际上是不必要的
1 | int Errupt; /* externally defined variable */ |
词汇表:
mandatory adj. 强制的,法定的,义务的 n. 受托者
之所以在函数内声明数组Up
的时候不需要指明数组内的元素个数,因为这些信息已经在原定义的地方说明了,而且这些声明并非必要的,因为外部变量具有文件作用域,在main
函数这也是有用的,但是声明也并非毫无作用(serve),可以说明你想在main
函数内使用这些变量
词汇表:
serve v. 对...有用(在这里的含义)
如果你在main
函数内不使用extern
来声明变量,而是直接声明一个同名变量,这样就意味着你使用了一个独立的(separate)自动变量(automatic variable)来替换掉main
函数作用域内的全局变量,即用
1 | int Errupt; |
来替换
1 | extern int Errupt; |
这时,main
函数告诉编译器创造一个叫Errupt
的独立的(separate),局部的(local),自动的(automatic)变量,与原来的(original)外部变量Errupt
区分,不过这是在main
函数范围内,其他函数,例如next
,依旧在外部变量Errupt的作用域内
如果两个同名变量的作用域相互重叠,那么在那个代码块内,起作用的是作用域小的那个变量,作用域大的变量会被暂时隐藏(hide)起来
一般而言不会这样做,但如果你真的需要用同名的局部变量,你最好用内存标识符auto
来说明(document)一下
由于外部变量具有静态存储周期,故对于Up
这个数组,不论(regardless of)程序在执行什么函数,它和它的值(values)都存在
这里有三个例子,说明了自动变量和外部变量的联合使用(combinations):
例子1中,main
和magic
都在外部变量Hocus
的作用域内
1 | /* Example 1 */ |
例子2中,magic
中虽然没有声明Hocus
,但是仍是可以使用的
1 | /* Example 2 */ |
例子3中,main
和magic
中的外部变量Hocus
被自动变量Hocus
覆盖,而且main
中的Hocus
和magic
的是独立的
1 | /* Example 3 */ |
词汇表:
illustrate v. 说明,解释,加插图于...
Initializing External Variables
外部变量默认会初始化为该类型的 0,但是如果你想要手动初始化也是可以的
1 | int x = 10; // ok, 10 is constant |
Using an External Variable
这里直接看一个例子
1 | /* global.c -- uses an external variable */ |
输出效果如下
1 | How many pounds to a firkin of butter? |
在这里,main
和critic
都可以使用units
External Names
现在对于局部的变量有效标识符长度为63个字符,而对于外部变量为31个字符,而在以前,局部是31个,外部为6个
词汇表:
revise v. 修正
comply v. 遵守
Definitions and Declarations
就是要分清楚声明和定义的区别
1 | // file one.c |
声明就是告诉编译器这里有个这样的变量,定义就是具体告诉编译器这个变量长什么样子,而且在外部文件引用外部变量时不能赋值,因为你的引用仅为声明,而非定义
好的,本次笔记到这里就结束了,谢谢各位的阅读