C程式中外部变量和函数关系解惑

2008-02-23 05:32:46来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

 C程式由一组对象组成,这些对象包括程式中所使用的变量和实现特定功能的函数。变量能够分为函数内部定义、使用的变量和函数外部定义的变量,通常情况下,把函数内部定义、使用的变量称为内部变量或局部变量,而将在函数外部定义的、供许多函数所使用的变量称为外部变量,一般情况下,也能够称为全局变量。

  由于C语言不允许在一个函数中定义其他函数,因此函数本身是外部的。一般情况下,也能够说函数是全局函数。
在缺省情况下,外部变量和函数具备如下性质:任何通过名字对外部变量和函数的引用(即使这种引用来自单独编译的函数)都是引用的同一对象(标准中把这一性质称为外部连接)。

  由于外部变量是能够全局访问的,这就为在函数之间交换数据提供了一种能够替代函数变元欲返回值的方法。任何函数都能够用名字来访问外部变量,只要这个名字已在某个地方做了说明或定义。

  假如要在函数之间共享大量的变量,那么使用外部变量要比使用一个长长的变元表更方便、有效。然而,也可能导致程式在各个函数之间产生太多的数据联系。

  外部变量的用途还表现在他们比内部变量有更大的作用域和更长的生存期。内部自动变量只能在函数内部使用,当其所在函数被调用时开始存在,当函数退出时消失。而外部变量是永久存在的,他们的值在从一次函数调用到下一次函数调用之间保持不变。因此,假如两个函数必须共享某些数据,而这两个函数都互不调用对方,那么最为方便的是,把这些共享数据作为外部变量,而不是作为变元来传递。

  1、外部变量的定义和使用

  根据C语言标准,在程式的任何源文档中,外部变量只能被定义一次,否则会导致重复定义的编译错误。

  1.1 外部变量的定义和声明

  变量声明用于通报变量的性质(主要是变量的类型),而变量定义则除此之外还引起存储分配。假如在函数的外部包含如下说明:

int VarDesc;
char Array[MAXVAL];

  那么这两个说明定义了外部变量VarDesc和Array,并为之分配存储单元,同时也用作供源文档其余部分使用的说明。另一方面,如下两行:

extern int VarDesc;
extern char Array[];

  为源文档剩余部分声明了VarDesc是个int 类型的外部变量,Array是个char数组类型的外部变量(数组大小在其他地方确定),但这两个声明并没有建立变量或为他们分配存储单元,其中关键字extern表明该外部变量在其他地方被定义。

  根据C语言标准,外部变量虽然只能在某个文档中定义一次,但其作用域则是从其声明处开始一直到其所在的被编译的文档的末尾。因此其他文档能够通过extern说明来访问他。

  1.2 外部变量的使用方式

  假如外部变量被不同的函数所引用,并且这些函数没有集中在一个源文档中,而是分布在不同的源文档中,那么函数在引用这些外部变量时,必须采取先声明再使用的方式,否则,在编译时会导致重复定义的编译错误。

  若在多个文档的多个函数中引用外部变量,就需要在这些函数中重复声明外部变量。这种方式能够解决编译问题,但是代码不够简洁。因此,在实际的编程中,大都采取了将外部变量统一定义在一个C源文档中,这个C源文档一般被称为global.c,然后在对应的头文档中,一般为global.h,声明外部变量,最后在需要引用外部变量的源文档中使用#include "global.h"的方式,函数就能够引用任何的外部变量。因此,一般情况下,global.c内容为:

#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 函数的组织和使用

  假如某个函数需要引用另一个函数,则需要在引用该函数前声明被引用的函数,否则可能会导致函数未定义错误。

  为了避免被引用函数的重复声明和方便函数的引用,在实际的编程之中,采用在对应的头文档中,统一声明函数的方式。需要引用某一个函数时,只需要在该函数的定义源文档中包含被引用函数的头文档即可。

  在实际的编程中,在头文档中声明函数,即声明函数原型,在对应的C源文档中,定义函数及其实现代码。因此,函数说明的头文档内容和格式为:

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: C 词汇解析集锦 编程研发人员必备(1)

下一篇: 深入理解C 中的mutable关键字