C 程序的外部变量与函数 摘要
本文讨论了C程序的外部变量和函数的一些性质,结合实际的编程,给出了使用外部变量和函数的方法。 关键字:C程序,外部变量,函数 C程序由一组对象组成,这些对象包括程序中所使用的变量和实现特定功能的函数。变量可以分为函数内部定义、使用的变量和函数外部定义的变量,通常情况下,把函数内部定义、使用的变量称为内部变量或局部变量,而将在函数外部定义的、供许多函数所使用的变量称为外部变量,一般情况下,也可以称为全局变量。 1、外部变量的定义和使用 1.1 外部变量的定义与声明 变量声明用于通报变量的性质(主要是变量的类型),而变量定义则除此之外还引起存储分配。如果在函数的外部包含如下说明: int VarDesc; char Array[MAXVAL];那么这两个说明定义了外部变量VarDesc与Array,并为之分配存储单元,同时也用作供源文件其余部分使用的说明。另一方面,如下两行: extern int VarDesc; extern char Array[];为源文件剩余部分声明了VarDesc是一个int 类型的外部变量,Array是一个char数组类型的外部变量(数组大小在其他地方确定),但这两个声明并没有建立变量或为它们分配存储单元,其中关键字extern表明该外部变量在其他地方被定义。 根据C语言标准,外部变量虽然只能在某个文件中定义一次,但其作用域则是从其声明处开始一直到其所在的被编译的文件的末尾。因此其他文件可以通过extern说明来访问它。 1.2 外部变量的使用方式 如果外部变量被不同的函数所引用,并且这些函数没有集中在一个源文件中,而是分布在不同的源文件中,那么函数在引用这些外部变量时,必须采取先声明再使用的方式,否则,在编译时会导致重复定义的编译错误。 #include "global.h" /* for example, define two vars */ int VarDesc; char Array[MAXVAL]; /* other external var define */在对应的global.h头文件的内容则为: #ifndef _GLOBAL_H /* please insure _GLOBAL_H unique */ #define _GLOBAL_H /* avoid quotation iterativly */ #ifdef __cplusplus extern "C" { #endif /*__cplusplus */ /* for example, declare two vars */ extern int VarDesc; extern char Array[]; /* other external vars declaration */ #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* _GLOBAL_H */此外,在实际的编程中,这两个文件头部还应当有公司copyright声明、文件功能说明、版本说明、创建、修改历史等。 2、函数的定义和使用 根据C语言标准,函数只能被定义一次,而且在函数中,不能再定义函数,因此函数本身是外部的。 2.1 函数的定义与声明 定义函数是给出函数体的函数描述。一个函数只有在声明之后才能被引用。函数声明中,需给出函数名、返回类型、参数列表等。 函数的作用域从其声明处开始一直到其所在的被编译的文件的末尾,如果一个函数在定义之前就要使用到,或者这个函数定义在与所要使用它的源文件不相同的源文件中,那么就需要在使用该函数前,使用关键字extern声明该函数,但由于函数默认是external的,因此函数声明前的extern可以省略,这也是标准库函数的头文件中,函数声明前没有extern的原因,但在实际的编程中,一般不推荐这样做,应当在函数声明前加上extern。 2.2 函数的组织和使用 如果某个函数需要引用另一个函数,则需要在引用该函数前声明被引用的函数,否则可能会导致函数未定义错误。 为了避免被引用函数的重复声明和方便函数的引用,在实际的编程之中,采用在对应的头文件中,统一声明函数的方式。需要引用某一个函数时,只需要在该函数的定义源文件中包含被引用函数的头文件即可。 #ifndef _FUNCNAME_H /* please insure _ FUNCNAME _H unique */ #define _ FUNCNAME _H /* avoid quotation iterativly */ #ifdef __cplusplus extern "C" { #endif /*__cplusplus */ /* for example, declare functions */ extern int func (int, int, int); /* of course, maybe declare functions like below * int func (int, int, int); */ /* other functions declaration */ #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* _ FUNCNAME _H */ 而在对应的C源文件内容为: #include " funcname.h" /* for example, define two vars */ int func (int a, int b, int c) { // functions body } /* other functions define */在实际的函数头文件和定义文件中还应当包含相应的头文件等,以及公司copyright声明、文件功能说明、版本说明、创建、修改历史等。对于具体的函数,还应当有函数说明、输入参数说明、返回说明、例外等。 3、静态外部变量和函数 如果某外部变量和函数仅供它们各自所在的源文件中的函数使用,而不能被其他函数访问,那么就必须使用static关键字定义外部变量和函数。static说明适用于外部变量与函数,用于把这些对象的作用域限定为被编译源文件的剩余部分。通过外部static对象,可以把一些外部变量和函数隐藏在某个源文件中,使得这些外部变量和函数仅仅可以被该源文件使用和共享,但不能被该源文件之外的函数所引用。 #include “funcname.h” /* for example, define one static external var and one static function */ static int VarName = 0; static int function (int a) { // function body } /* other static vars and functions */ /* for example, define one function */ char func (char*, char) { VarName = 5; function (VarName); // other function body } /* other functions define */参考文献:
|
|