深刻理解----修饰变量----关键字

1.extern关键字

  • 基本解释:引用一个全局的量,
    • extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。

使用介绍

①全局的变量

  • 在一个源文件里定义了一个变量,int i = 0;
  • 在另一个文件里用 extern int i;就可以访问同一个变量i;

②全局的常量

  • 在一个源文件里定义了一个常量,int const i = 0;
  • 在另一个文件里用 extern const int i;就可以访问同一个常量i;

③坑

  • 不能有重复定义的全局变量----不能在两个文件定义一样的变量
    • 即不能在两个文件中,int i = 0;或者int const i = 0;
  • 如果全局变量被修饰为全局常量,那么也应该应用全局常量---加const

2.宏定义 #define

  • 宏定义又称为宏代换、宏替换,简称“宏”。

说明:

- (1)宏名一般用大写
- (2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义
- (3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。
- (4)宏定义末尾不加分号;
- (5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。
- (6)可以用#undef命令终止宏定义的作用域
- (7)宏定义可以嵌套
- (8)字符串" "中永远不包含宏
- (9)宏定义不分配内存,变量定义分配内存。
- (10)宏定义不存在类型问题,它的参数也是无类型的。

有参宏定义中#的用法

  • 加双引号
    #define STR(str) #str
    #用于把宏定义中的参数两端加上字符串的""
    比如,这里STR(myname)会被替换成"myname"

有参宏定义中##的用法

  • 拼接
  #define WIDE(str) L##str
  则会将形参str的前面加上L
  比如:WIDE("abc")就会被替换成L"abc"
  如果有#define FUN(a,b) vo##a##b()
  那么FUN(id ma,in)会被替换成void main()
宏定义的值,在程序中是不可改变的值,而且在引用的时候会分配临时内存空间

3.定义全局变量

  • 全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。
  • 当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。
①全局变量当没有其他关键字修饰时。他定义的值可以在其他地方更改,但是好处是只分配一份内存空间。

②当全局变量被const关键字修饰时。他定义的是常量,他的值不能在其他地方更改,而且在内存中也只占用一份内存空间。

4.const关键字

  • const用法主要是防止定义的对象再次被修改,定义对象变量时要初始化变量。节约内存空间,

5.static关键字

  • 首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0.

①.修饰局部变量

  • 不改变局部变量作用域
  • 延长了局部变量的寿命,可以让局部变量在整个程序运行过程中只有一份内存,且只会初始化一次

②.修饰全局变量

  • 让这个全局变量仅限于当前文件能访问(哪个文件:定义这个全局变量的文件)

6.static 关键字 搭配 const 关键字

  • 不能被外界引用,而且是常量
  • 防止重复定义
原文地址:https://www.cnblogs.com/ShaoYinling/p/4743206.html