第四章:函数与程序结构
作用域规则
- 外部变量的声明必须指定数组长度,而extern声明使用外部变量却不用指定 数组长度
静态变量
-
介绍: 被static修饰的变量或函数为静态变量或静态函数
-
特点: 静态变量或者函数只能被本文件访问,外部不可以访问
寄存器变量
-
使用register声明变量
-
特点:思想是将使用频率高的变量放到寄存器中,从而使程序更小,运行速度更快
-
注意事项:并不是你用register声明一个变量后,这个变量就是寄存器变量了,编译器会忽略过量的或者不支持的类型的寄存器变量声明,但是无论是不是最后放到寄存器中, 一旦使用register声明后,这个变量的地址都是不可访问的。
初始化
- 在没有显式初始化的情况下,外部变量和静态变量被初始化为0,寄存器变量和自动变量的初值未定义即无意义的值。
- 对于外部变量和静态变量来说,初始化表达式必须为常量表达式(因为在程序运行前就已经初始化了嘛,我是这样理解的)
- 自动变量和寄存器变量则在每次进入函数中或程序块才被初始化
C预处理器
-
文件包含
-
#include< 文件名>:该行声明处将被替换为文件名指定的文件的内容,如果在该位置没有找到文件也会按照相应的规则去查找文件
-
注意事项: 如果某个被引用的文件内容发生了变化,那么所有依赖该文件的源文件必须重新编译
-
-
宏替换
-
#define name 替换内容
-
替换内容是name后所有内容,当内容过长时,可以在每行后面追加\换行
-
#define的作用域从定义开始到源文件结束
-
宏替换可以是任意的:
- 定义无限循环:#define forever for(;????
-
宏替换可以带参数:
- #define max(A,B) (A > B ? A : B)
- 但是这样会出问题,比如,max(A++,B++), 这样的操作会执行两次自增操作
-
-
取消宏替换
- #undef name
-
运算符连接实际参数
- #define paste(a,b) a##b
paste(name,1) 相当于name1
- #define paste(a,b) a##b
-
条件包含
- #if !define
#define name 替换内容
#elif a == b
#define …
#endif
- #if !define
注意
- 定义的函数未声明返回类型则返回类型为 int
- 函数的定义和声明必须一致,如果在同一个文件中定义和声明不一致可以检测出来,但是不同文件时检测不出来的。