标识符的作用域是指标识符的生效范围
通常有两种:
一、局部作用域
局部 变量只在对应的局部范围内生效。
局部变量在定义后系统为其分配内存,没有进行初始化时,其值为随机值。
二、全局作用域
利用全局变量可以实现函数传参的效果。
规定:全局变量定义后如果未初始化,系统会自动将其以位模式清0;
C语言中,函数具有全局的作用域。
三、标识符的可见性
规则:
1.标识符必须先定义再使用;
2.同一作用域中不能定义同名标识符
3.在没有包含关系的作用域中定义的同名标识符互不影响;
4.在两个或者两个具有包含关系的不同作用域中定义的同名标识符,外层标识符在内层不可见(就近原则)
变量的生存期
变量的生存期(Lifetime)指的是变量在程序执行过程中从创建到销毁的时间段。变量的生存期分为静态生存期和动态生存期。
一、静态生存期
具有静态生存期的变量在程序开始执行时被分配,并在程序结束时被销毁。它们在整个程序运行期间都存在。有两种:
1 .全局变量
2.被 static
关键字(将变量的生存期由动态生存期修改为静态生存期)声明的局部变量,它们的生存期也是整个程序运行期间,但作用域仅限于定义它们的函数内。
二、动态生存期
具有动态生存期的变量在程序执行过程中根据需要动态地分配和释放。它们的生存期由程序的逻辑控制。
1.普通的局部变量。
register 关键字是一种建议而非命令。有可能在RAM中或者CPU的Caches中,对这变量无法进行取地址运算。
static关键字作用与函数时,意义是限制函数的使用范围,限制该函数只能在本程序.c文件中使用,其他.c文件不能使用。
写好的C程序会经过以下步骤被计算机处理:
编辑:程序员编写的代码
预处理 :
- 预处理器会处理所有以
#
开头的指令(如#include
、#define
等)。 - 预处理器将会:
- 处理宏定义(用实际值替换宏)。
- 处理头文件包含(将包含的头文件内容插入到源文件中)。
- 去除注释。
- 生成一个扩展名通常为
.i
的中间文件
编译:
- 预处理后的代码将被编译器编译,转换为汇编代码。这个阶段会进行语法检查和优化。
- 编译器将会生成汇编代码文件,通常扩展名为
.s
。
链接:
链接器将一个或多个目标文件和库文件链接在一起,生成一个可执行文件
运行
四、预处理命令
1.宏定义
(1) 不带参数的 宏定义
所有的宏定义都是简单的文本替换。
(2)带参数的宏
定义使用#define
指令,参数列表放在宏名称后面的括号中。宏定义中的参数在使用时会被实际的参数值替换。形参不需要写数据的类型。
五、条件编译
主要通过预处理器指令实现,常用的指令包括:
#ifdef
和#ifndef
:检查某个宏是否定义。#if
和#elif
:判断表达式是否为真。#else
和#endif
:与上述指令配合使用,定义条件分支的结束。
条件编译常与宏定义结合使用。通过 #define
和 #undef
可以控制哪些代码片段会被编译。