1.extern
在一个源程序的所有文件中,一个外部变量只能在某个文件中定义一次,而其他文件可以通过extern声明来访问它。如在file1中定义变量:
int x1 = 5;
在file2中可以声明:
extern int x1;
来使用x1变量。
2.static
用static声明限定外部变量与函数,可以将其声明的对象的作用于限定为被编译源文件的剩余部分,其他文件不能访问,达到隐藏外部对象的目的。
static也可以用于声明内部变量,static类型的内部变量和自动变量一样,只能在该函数中被使用,但是它与自动变量不同的是,不管其所在函数是否被调用,它一直存在,而不像自动变量一样,随着所在函数的被调用和退出而存在和消失。换句话说,static类型的内部变量是一种只能在某个特定函数中使用但一直占据存储空间的变量。
3.预处理之条件包含
#ifndef是常见的预处理的条件包含命令。其主要作用是保证在一个源文件中只包含一次头文件。
预处理阶段会将#include命令整个替换成头文件,因此如果头文件里有复杂的包含关系,比如a.cpp包含a.h和b.h,a.h里包含b.h,那么b.h中如果有#ifndef,那么在a.cpp中就只会有一次b.h的出现了。
在头文件中按照编程规范,是应该只有声明而没有定义的(即函数只有声明没有实现,变量只有声明没有赋初值和分配空间),那么在一个源文件中包含多次声明其实并没有问题。但是C的语法并没有限制头文件里不能包含实现,因此#ifndef主要是为了防止在程序中出现重复定义的情况。