外部变量的定义只能一次,它在所有函数之外,而同一文件中的外部变量的声明可以有多次,它可 在函数内也可在函数外 对外部变量的初始化只能在定义时进行,而不能在声明中进行。 存储类别小结 作用域角度分 局部变量 自动变量即动态局部变量(离开函数,值就消失) 静态局部变量(离开函数,值仍保留) 寄存器变量(离开函数,值就消失) (形式参数可以定义为自动变量或寄存器变量 全局变量: 静态外部变量(只限本文件引用) 外部变量(即非静态的,允许其他文件引用) 从变量存在的时间分: 态存储:自动变量、寄存器变量、形式参数 静态存储:静态局部变量、静态外部变量、外部变量 从变量值存放的位置分 内存中的静态存储区:静态局部变量、静态外部变量、外部变量 内存中的动态存储区:自动变量和形式参数 寄存器:寄存器变量 static对局部变量和全局变量的作用不同 对局部变量来说,它使变量静态存储, 对全局变量来说,它使变量局部化(本文件),但仍为静态存储。 从作用域角度看,凡有 static声明的,其作用域是局限的,或局限于本函数内,或局限于本文 内 内部函数和外部函数 、内部函数
1、外部变量的定义只能一次,它在所有函数之外,而同一文件中的外部变量的声明可以有多次,它可 在函数内也可在函数外。 2、对外部变量的初始化只能在定义时进行,而不能在声明中进行。 8. 存储类别小结 从作用域角度分: 局部变量: 自动变量即动态局部变量(离开函数,值就消失) 静态局部变量(离开函数,值仍保留) 寄存器变量(离开函数,值就消失) (形式参数可以定义为自动变量或寄存器变量) 全局变量: 静态外部变量(只限本文件引用) 外部变量(即非静态的,允许其他文件引用) 从变量存在的时间分: 动态存储:自动变量、寄存器变量、形式参数 静态存储:静态局部变量、静态外部变量、外部变量 从变量值存放的位置分: 内存中的静态存储区:静态局部变量、静态外部变量、外部变量 内存中的动态存储区:自动变量和形式参数 寄存器:寄存器变量 static 对局部变量和全局变量的作用不同。 1. 对局部变量来说,它使变量静态存储, 对全局变量来说,它使变量局部化(本文件),但仍为静态存储。 2. 从作用域角度看,凡有 static 声明的,其作用域是局限的,或局限于本函数内,或局限于本文 件内。 内部函数和外部函数 一、内部函数
个函数只能被本文件中其他函数所调用。 即: static类型标识符函数名(形参表) 如: static int a, int b) 、外部函数 个函数可供其他文件调用,称为外部函数 定义时声明或调用时声明,即 extern fun (int a, int b) 定义时 o extern fun (int a, int b) 调用时 在定义时,也可省写 extern,即为外部函数 编译预处理 3编译预处理 宏定义 宏:代表一个字符串的标识符。 宏名:被定义为“宏”的标识符 宏代换(展开):在编译预处理时,对程序中所有出现的“宏名”,用宏定义中的字符串去代 的过程 不带参数的宏定义 般形式 标识符 字符串 说明:
一个函数只能被本文件中其他函数所调用。 即:static 类型标识符 函数名(形参表) 如:static int fun( int a,int b) 二、外部函数 一个函数可供其他文件调用,称为外部函数 定义时声明或调用时声明,即: extern int fun(int a, int b ) 定义时 或 extern fun(int a, int b ) 调用时 在定义时,也可省写 extern ,即为外部函数 编译预处理 4 . 3 编译预处理 1. 宏定义 宏: 代表一个字符串的标识符。 宏名:被定义为“宏”的标识符。 宏代换(展开):在编译预处理时,对程序中所有出现的 “宏名”,用宏定义中的字符串去代 换的过程。 一、不带参数的宏定义 一般形式: #define 标识符 字符串 说明:
1)宏名一般用大写表示,以便与变量名区分 使用宏名使程序易读,易修改。 (3)只作简单的置换,不作正确性检查 4)宏定义不是C语句,不必在行末加分号 5宏名的作用域一般从自定义命令到本源文件结束 6)可以用# undef命令终止宏定义的作用域 7)宏定义允许嵌套,允许层层置换。 8)宏名在源程序中用双引号括起来,则TC中预处理不对其作宏代换 ⑨)宏定义与定义的变量不同,宏只作字符替换,不分配内存空间 00对“输出格式”进行宏定义,可以减少书写麻烦 、带参数的宏定义 格式:# define 宏名(参数表)字符串 说明: 1)对带参数的宏展开只是将宏名后括号内的实参 字符串代替# define命令行中的形参。 2)宏定义时,在宏名与带参数的括号之间不应加 空格,否则将空格以后的字符都作为替代字符 串的一部分。 3带参宏定义,形参不分配内存单元,因此不必 作类型定义。(与函数的区别之一) 4带参宏与函数的区别之二 、带参的宏定义和函数不同: 函数调用时,先求实参表达式值,后代入。而带参的宏只是进行简单的字符替换
⑴宏名一般用大写表示,以便与变量名区分。 ⑵使用宏名使程序易读,易修改。 ⑶只作简单的置换,不作正确性检查。 ⑷宏定义不是 C 语句,不必在行末加分号。 ⑸宏名的作用域一般从自定义命令到本源文件结束。 ⑹可以用# undef 命令终止宏定义的作用域。 ⑺宏定义允许嵌套,允许层层置换。 ⑻宏名在源程序中用双引号括起来,则 TC 中预处理不对其作宏代换。 ⑼宏定义与定义的变量不同,宏只作字符替换,不分配内存空间。 ⑽对“输出格式”进行宏定义,可以减少书写麻烦 二、带参数的宏定义 格式:#define 宏名(参数表) 字符串 说明: ⑴对带参数的宏展开只是将宏名后括号内的实参 字符串代替#define 命令行中的形参。 ⑵宏定义时,在宏名与带参数的括号之间不应加 空格,否则将空格以后的字符都作为替代字符 串的一部分。 ⑶带参宏定义,形参不分配内存单元,因此不必 作类型定义。(与函数的区别之一) ⑷带参宏与函数的区别之二 三、带参的宏定义和函数不同: 1、函数调用时,先求实参表达式值,后代入。而带参的宏只是进行简单的字符替换