`

C 程序的外部变量与函数

阅读更多

本文讨论了C程序的外部变量和函数的一些性质,结合实际的编程,给出了使用外部变量和函数的方法。

关键字:C程序,外部变量,函数

   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源文件中,定义函数及其实现代码。 因此,函数说明的头文件内容和格式为:

#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对象,可以把一些外部变量和函数隐藏 在某个源文件中,使得这些外部变量和函数仅仅可以被该源文件使用和共享,但不能被该源文件之外的函数所引用。
  另外,static说明也可以用 于说明内部变量。内部静态变量就像自动变量一样局部于某一个特定函数,只能在该函数中使用,但与自动变量不同的是,不管其所作函数是否被调用,它都是一直 存在的,而不像自动变量那样,随着所在函数的调用与退出而存在与消失。换而言之,内部静态变量是一种只能在某一特定函数中使用的但一直占据存储空间的变 量。 
  一般情况下,为保证静态外部变量和函数能够被本源文件的函数所引用,需要在该源文件的所有函数之前定义静态外部变量和函数。 那么,该C源文件的内容为:

#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 */
 
参考文献:
  • B.W.Kernighan, D.M.Ritchie著,徐宝文译,机械工业出版社 《C程序设计语言(第2版)》
  • Bjarne Stroustrup著,裘宗燕译, 机械工业出版社 《C++程序设计语言(特别版)》
分享到:
评论

相关推荐

    C语言之外部变量讲解

    ### C语言之外部变量讲解 #### 一、外部变量(全局变量)概念 在C语言中,外部变量也称为全局变量。全局变量是指在函数外部声明的变量,这些变量在整个程序执行期间都保持有效,可以在整个程序范围内被访问。与之...

    《C语言程序设计基础与实训教程》第6章:函数.ppt

    "《C语言程序设计基础与实训教程》第6章:函数" 在C语言程序设计中,函数是一个基本的组成单位,可以很方便地用函数作为程序模块来实现C语言程序的编写。利用函数,不仅可以实现程序的模块化,使程序设计变得简单和...

    C语言、变量和函数的作用域与生存期

    C语言中的变量和函数的作用域与生存期是编程中...理解并正确使用变量和函数的作用域以及生存期,对于编写高效、可维护的C语言程序至关重要。避免过度依赖全局变量,合理利用存储类型说明符,可以使代码更清晰、更安全。

    C语言程序设计-指针与函数.pptx

    "C语言程序设计-指针与函数"的主题深入探讨了如何使用指针来操作和调用函数,特别是函数型指针变量的概念。 首先,我们要理解函数型指针变量的定义。在C语言中,每个函数在内存中都有一个唯一的地址,这个地址被...

    C语言程序设计(第2版)-2期 经验技巧3-4 巧用外部变量.pdf

    在C语言程序设计中,合理地使用变量是提高程序效率和可读性的关键。外部变量,也称为全局变量,是在所有函数外部定义的变量,它们在整个程序的生命周期内都存在,且可以被程序中的多个函数访问。然而,使用外部变量...

    c语言指针变量作为函数参数传递

    总的来说,指针变量作为函数参数传递是C语言中一种非常重要的技术,它能够允许函数直接访问和修改函数外部的数据,扩展了函数的功能,但同时也对程序员提出了更高的要求,特别是在内存管理和错误处理方面需要更加...

    外部变量.zip

    在程序设计中,外部变量是指在函数外部定义的变量,它们的作用域超出单个函数,可以在多个函数或整个程序范围内被访问。这样的变量通常具有全局性,对程序的不同部分产生影响。 描述中的“外部变量”进一步确认了...

    c语言程序设计基础5函数.ppt

    《C语言程序设计基础5函数》 在C语言编程中,函数是构建程序的基本单元,它们使得代码组织清晰,可读性增强,并有效减少重复工作。本章主要讲解了五个关键知识点:函数的基础知识,函数原型与函数调用,函数的嵌套...

    C语言程序设计(第2版)-2期 拓展知识2-6 扩充和限定外部变量的作用域.pdf

    在C语言程序设计中,了解如何管理和控制外部变量的作用域是非常关键的,因为这直接影响到程序的可读性、维护性和正确性。外部变量(extern variables)是在全局作用域中定义的,通常在所有函数中都可以访问。但在...

    C语言函数速查 C语言函数大全 C函数

    总结来说,C语言函数是实现功能的核心工具,熟练掌握函数的定义、调用、参数传递、返回值处理等技巧,将使你能够编写出更高效、更易维护的C程序。在编程实践中,不断探索和理解这些知识点,将有助于提升你的C语言...

    C语言程序设计No-第八章函数完美版资料.ppt

    通过本资源摘要信息,读者可以了解C语言程序设计中函数的概念和应用,并且可以更好地理解函数的定义、参数、调用、嵌套调用、递归调用、数组作为函数参数、局部变量和全局变量、变量的存储类别、内部函数和外部函数...

    C 语言变量,函数重定义问题

    ### C/C++中的变量与函数重定义问题解析 在C/C++编程中,变量和函数的正确声明与定义是至关重要的。错误的处理可能会导致编译错误或运行时错误,严重时甚至会导致程序崩溃。本文将详细介绍C/C++开发过程中关于变量...

    c语言程序设计教学资料函数学习教案.pptx

    在C语言程序设计中,函数扮演着至关重要的角色,它是一种模块化程序设计的基本单元,使得复杂的代码组织和管理变得更加清晰、高效。本教学资料详细介绍了函数的学习,旨在帮助学生理解并掌握C语言中函数的定义、使用...

    C语言程序设计:函数.pptx

    C语言程序设计;函数;§8.1 函数的概念;几点说明: (1)一个源文件由一个或者多个函数组成。 (2)一个C程序由一个或者多个源文件组成。 (3)C程序的执行从main 函数开始。 (4)所有的子函数都是平行的。 (5)从用户的角度...

    C语言程序设计:第6章 模块化程序设计与函数

    C语言程序设计:模块化程序设计与函数 本章节将详细介绍C语言程序设计中的模块化程序设计和函数。模块化程序设计是大规模程序开发策略之一,是将一个原始复杂任务分解为多个较简单的子任务,从而降低程序开发和修改...

    c语言程序设计教学资料函数PPT学习教案.pptx

    9. **标准函数与库函数**:C语言提供了一系列预定义的标准函数,称为库函数,如`printf`、`scanf`等,可以直接在代码中使用,无需用户自己定义。这些函数在不同C系统中的可用性和功能可能有所不同,但基础功能通常是...

    C语言程序设计标准教程

     可以说C程序的全部工作都是由各式各样的函数完成的, 所以也把C语言称为函数式语言。 由于采用了函数模块式的结构, C语言易于实现结构化程序设计。使程序的层次结构清晰,便于程序的编写、阅读、调试。  在...

    c_全局变量

    4. 外部变量(extern):外部变量是指在函数外部定义的变量,它们的生命周期是整个源程序文件,并且它们的存储位置是在静态存储区中。 在C语言中,变量的作用域可以是以下几种: 1. 局部变量的作用域:局部变量的...

    C语言中static变量使用方法

    例如,外部变量(也称为全局变量)虽然也是静态存储方式,但在定义时需要显式地使用`static`关键字来标记为静态外部变量或静态全局变量。 #### 静态局部变量的特性 静态局部变量是在函数内部定义的,但它拥有整个...

    C语言是通过函数来实现模块化程序设计的所以较大的C语PPT.ppt

    函数是C语言程序设计的基本单元,它可以将复杂的程序拆分成多个小的、独立的模块,使得程序更易于维护和修改。 Functions in C programming language are essential for implementing modular program design. A ...

Global site tag (gtag.js) - Google Analytics