c语言的变量作用域及头文件
C语言的变量作用域及头文件
关于C语言的变量作用域和头文件的问题都是比较基础的问题,但是这些问题在实际使用过程中的概念不
清和混乱会对一个多文件的项目的组织结构及文件结构造成很大的影响,使得项目本身的脉络也变的很模
糊。在项目中,多人相互协作完成的项目,这个问题就更加突出。所以也就有了我写 (总结)这个文档。
一.C语言的变量作用域及相关
1.作用域:
作用域描述了程序中可以访问一个标识符的一个或多个区域。即变量的可见性。一个C
变量的作用域可以是代码块作用域、函数原型作用域,和文件作用域。函数作用域(Function
Scope),标识符在整个函数中都有效。只有语句标号属于函数作用域。标号在函数中不需
要先声明后使用,在前面用一个goto语句也可以跳转到后面的某个标号,但仅限于同一个
函数之中。 文件作用域 (File Scope),标识符从它声明的位置开始直到这个程序文件的
末尾都有效。例如下例中main函数外面的sum,add,还有main也算,printf其实是在stdio.h
中声明的,被包含到这个程序文件中了,所以也算文件作用域的。块作用域(BlockScope),
标识符位于一对{}括号中 (函数体或语句块),从它声明的位置开始到右}括号之间有效。
例如上例中main函数里的num。此外,函数定义中的形参也算块作用域的,从声明的位置
开始到函数末尾之间有效。 函数原型作用域 (Function Prototype Scope),标识符出现
在函数原型中,这个函数原型只是一个声明而不是定义 (没有函数体),那么标识符从声明
的位置开始到在这个原型末尾之间有效。例如void add(int num);中的num。
下面再介绍另一种分类形式:它分为代码块作用域和文件作用域。代码块作用域和文件
作用域也有另一种分类方法,局部作用域和全局作用域。
代码块作用域:代码块是指一对花括号之间的代码,函数的形参虽然是在花括号前定义
但也属于代码作用域。在C99中把代码块的概念扩大到包括由for循环、while循环、dowhile
循环、if语句所控制的代码。在代码块作用域中,从该变量被定义到代码块末尾该变量都
可见。 文件作用域:一个在所有函数之外定义的变量具有文件作用域。具有文件作用域的
变量从它的定义处到包含该定义的文件结尾都是可见的。
2.链接
一个C语言变量具有下列链接之一:外部链接(externallinkage),内部链接(internal
linkage)或空链接 (no linkage)。 空链接:具有代码块作用域或者函数原型作用域的变
量就具有空链接,这意味着他们是由其定义所在的代码块或函数原型所私有。 内部链接:
具有文件作用域的变量可能有内部或外部链接,一个具有文件作用域的变量前使用了
static标识符标识时,即为具有内部链接的变量。一个具有内部链接的变量可以在一个文
件的任何地方使用。外部链接:一个具有文件作用域的变量默认是具有外部链接的。但当起
前面用static标识后即转变为内部链接。一个具有外部链接的链接的变量可以在一个多文
件程序的任何地方使用。
例: static inta; (在所有函数外定义)内部链接变量 intb; (在所有函数外定义) 外
部链接变量 main() {
int b;//空链接,仅为main函数私有。
..
}
3.存储时期
一个C语言变量有以下两种存储时期之一: (未包括动态内存分配malloc和free等)
静态存储时期 (staticstorageduration)和自动存储时期 (automaticstorageduration)
和动态存储时期。 静态存储时期:如果一个变量具有静态存储时期,他在程序执行期间将
一直存在。具有文件作用域的变量具有静态存储时期。这里注意一点:对于具有文件作用域
的变量,关键词static表明链接类型,而不是存储时期。一个使用了static声明了的文件
作用域的变量具有内部链接,而所有的文件作用域变量,无论他具有内部链接,是具有外部
链接,都具有静态存储时期。
自动存储时期:具有代码块作用域的变量一般情况下具有自动存储时期。在程序进入定
义这些变量的代码块时,将为这些变量分配内存,当退出这个代码块时,分配的内存将被释
放。
举例如下:
//example_1.c
1. #include
2. #