extern(外部)
介绍
extern存储类用于定义在其他文件中声明的全局变量或函数。当使用 extern 关键字时,不会为变量分配任何存储空间,而只是指示编译器该变量在其他文件中定义。
实例1(声明变量)
变量a在文件514中已经定义,使用extern在文件114中声明,指示编译器该变量在其他文件中定义。
全局变量具有外部链接属性。相当于使用extern链接的手段将全局变量a在文件114中声明。
在下面的static修饰全局变量还会提到
实例2(声明函数)
函数也具有外部链接属性。相当于使用extern链接的手段将函数Add在文件114中声明。
在下面的static修饰函数还会提到
define(定义)
介绍
define用于为各种数据类型定义别名
实例1(定义常量)
形式:
#define 常量名 常量值
实例2(定义类型名)
形式:
#define 新类型名 原类型名
实例3(定义关键字)
形式:
#define 新名 原名
实例4(定义宏)
形式:
#define 宏名(参数) 宏体
参数是无类型的
实例5(定义语句)
形式:
#define 名字 语句
拓展
如果define定义的语句过长(需要好几行),就可以用\(续行符)续行。
typedef(类型定义)
介绍
类型定义(类型重命名)
将类型重定义
实例
形式:
typedef 原类型名 新类型名
static(静态的)
介绍
static是用来修饰变量和函数的
修饰局部变量——称为静态局部变量(改变了变量的存储位置和作用周期)
修饰全局变量——称为静态全局变量(改变了变量的作用域)
修饰函数——称为静态函数(改变了函数的作用域)
实例1(修饰局部变量)
未被static修饰
被static修饰
static修饰的局部变量使编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和退出作用域时进行创建和销毁,因此,使用static修饰局部变量可以在函数调用之间保持局部变量的值。静态变量在程序中只被初始化一次。
本质上,static修饰局部变量时,局部变量变成了静态局部变量,改变了变量的存储位置,在静态区开辟了一个新的内存区,然后把a存进了新的内存区
放在静态区的的数据出了作用域不会被销毁,在程序结束时才会销毁
实例2(修饰全局变量)
把全局变量a用static修饰之后,再用extern引用就会报错,这是怎么回事呢?
原来是全局变量具有外部连接属性,而被static修饰的全局变量就只有了内部链接属性,其他源文件就不能用这个全局变量。
当static修饰全局变量时,会使变量的作用域限制在声明它的文件内。
全局变量本身是可以在整个工程中使用的,但被static修饰之后,就只能在当前文件使用了,相当域作用于变小了。(本质是外部连接属性变成了内部链接属性)
限制全局变量的作用域的原因(作用)有:
1、全局变量的作用域太大,标识符可能与其他变量冲突;
2、变量在任何地方都可以使用和更改,变量的安全性得不到保障。
实例3(修饰函数)
把函数Add用static修饰之后,再用extern引用就会报错,原因与全局变量被static修饰一样。
函数具有外部连接属性,而被static修饰的函数就只有了内部链接属性,其他源文件就不能用这个函数。
当static修饰函数时,会使函数的作用域限制在声明它的文件内。
函数本身是可以在整个工程中使用的,但被static修饰之后,就只能在当前文件使用了,相当域作用于变小了。(本质是外部连接属性变成了内部链接属性)
register(寄存器)
介绍
register存储类用于定义存储在寄存器中的变量,这意味着变量的最大尺寸等于寄存器的大小,且不能对它应用一元的 '&'(取地址) 运算符(因为它没有内存位置),因为它不是存储在 RAM 中的。
因为变量定义存储在寄存器中,所以变量的访问速度更快,但是它不能直接取地址,因为它不是存储在 RAM 中的。
作用:在需要频繁访问的变量上使用 register 存储类可以提高程序的运行速度。
实例
register关键字并不是百分之百有效的,它只是建议把变量存储在寄存器内,能不能存储在寄存器内是由编译器决定的。
现在的编译器很智能,如果你电脑的寄存器空闲,即使你不把一个变量设成寄存器变量,它也会把变量放在寄存器内,来提升变量访问速度,提升读写效率。
如有错误,感谢指正。