`

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语言程序设计:函数.pptx

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

    C语言程序设计标准教程

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

    c中static用法

    C语言程序可以看成由一系列外部对象构成,这些外部对象可能是变量或函数。而内部变量是指定义在函数 内部的函数参数及变量。外部变量定义在函数之外,因此可以在许多函数中使用。由于C语言不允许在一个函数 中定义...

    谭浩强c语言程序设计

    谭浩强c语言程序设计(pdf版) 1 C语言概述 1.1 C语言的发展过程 1.2 当代最优秀的程序设计语言 1.3 C语言版本 1.4 C语言的特点 1.5 面向对象的程序设计语言 1.6 C和C++ 1.7 简单的C程序介绍 1.8 输入和输出...

    谭浩强 C语言程序设计 教程全书 Word版

    谭浩强 C语言程序设计 教程全书 Word版,内容预览: 1 C语言概述 2 1.1 C语言的发展过程 2 1.2 当代最优秀的程序设计语言 2 1.3 C语言版本 2 1.4 C语言的特点 3 1.5 面向对象的程序设计语言 3 1.6 C和C++ 3 ...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    4.12.6 用static声明静态外部变量 4.13 变量属性小结 4.14 关于变量的声明和定义 4.15 内部函数和外部函数 4.15.1 内部函数 4.15.2 外部函数 4.16 预处理命令 4.16.1 宏定义 4.16 2 “文件包含”处理 4.16.3 条件...

    《C语言程序设计》谭浩强

    用extern声明外部变量 123 9 预处理命令 9.1 概述 124 9.2 宏定义 125 9.2.1 无参宏定义 126 9.2.2 带参宏定义 127 9.3 文件包含 128 9.4 条件编译 130 9.5 本章小结 10 指针 10.1 地址指针的基本概念 131 10.2 变量...

    谭浩强版c语言程序设计

    用extern声明外部变量 123 9 预处理命令 9.1 概述 124 9.2 宏定义 125 9.2.1 无参宏定义 126 9.2.2 带参宏定义 127 9.3 文件包含 128 9.4 条件编译 130 9.5 本章小结 10 指针 10.1 地址指针的基本概念 131 10.2 变量...

    C程序设计 第四版 谭浩强 高清扫描版 带完整书签目录 加 学习辅导

    《C程序设计(第四版)》是由谭浩强教授著、清华大学出版社出版的《C程序设计》是一本公认的学习C语言程序设计的经典教材。根据C语言的发展和计算机教学的需要,作者在《C程序设计(第三版)》的基础上进行了修订。本书...

    c语言程序设计(第三版)

    8.9.5 用extern声明外部变量 23 9 预处理命令 1 9.1 概述 1 9.2 宏定义 1 9.2.1 无参宏定义 1 9.2.2 带参宏定义 4 9.3 文件包含 8 9.4 条件编译 9 9.5 本章小结 11 10 指针 1 10.1 地址指针的基本概念 1 10.2 变量...

    C语言程序设计(谭浩强)第三版

     1.4最简单的C语言程序  1.4.1最简单的C语言程序举例  1.4.2C语言程序的结构  1.5运行C程序的步骤与方法  1.6程序设计的任务  习题 第2章:算法——程序的灵魂 2.1什么是算法 2.2简单的算法举例 2.3算法的特性...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    4.12.6 用static声明静态外部变量 4.13 变量属性小结 4.14 关于变量的声明和定义 4.15 内部函数和外部函数 4.15.1 内部函数 4.15.2 外部函数 4.16 预处理命令 4.16.1 宏定义 4.16 2 “文件包含”处理 4.16.3 条件...

    C程序设计语言_第2版(带书签目录)

    第四章 函数与程序结构 4.1 函数的基本知识 4.2 返回非整数型的函数 4.3 外部变量 4.4 作用域规则 4.5 头文件 4.6 静态变量 4.7 寄存器变量 4.8 程序块结构 4.9 初始化 4.10 递归 4.11 C预处理 第五章 ...

    《C程序设计语言》(非扫描.新版)

    C程序设计语言 第1章 导言 1.1 入门 1.2 变量与算术表态式 ...第4章 函数与程序结构 第5章 指针与数组 第6章 结构 第7章 输入与输出 第8章 UNIX系统接口 附录A 参考手册 附录B 标准库 附录C 变更小结

    C语言程序设计实验报告

    说明:本题考查对程序每部分的理解、掌握,外部、内部变量,主函数,小函数的编写与应用。初步了解栈的一些实现函数。 (19)编程序找出2~5000中满足条件的数x:x是素数且x的每位数字是素数、每位数字之和是素数,...

    C程序设计语言[第2版].pdf

    全面、系统地讲述了C语言的各个特性及程序设计的基本方法,包括基本概念、类型和表达式、控制流、函数与程序结构、指针与数组、结构、输入与输出、UNIX系统接口、标准库等内容。 本书的讲述深入浅出,配合典型例证...

    C程序设计语言(第2版·新版)

    第4章 函数与程序结构 4.1 函数的基本知识 4.2 返回非整数值的函数 4.3 外部变量 4.4 作用域规则 4.5 头文件 4.6 静态变量 4.7 寄存器变量 4.8 分程序结构 4.9 初始化 4.10 递归 4.11 C预处理程序 ...

    C程序设计语言 很适合初学者和再学者学习和复习

    第4章 函数与程序结构 4.1 函数的基本知识 4.2 返回非整数值的函数 4.3 外部变量 4.4 作用域规则 4.5 头文件 4.6 静态变量 4.7 寄存器变量 4.8 分程序结构 4.9 初始化 4.10 递归 4.11 C预处理程序 ...

    C语言精典版本C程序设计语言

    第4章 函数与程序结构 4.1 函数的基本知识 4.2 返回非整数值的函数 4.3 外部变量 4.4 作用域规则 4.5 头文件 4.6 静态变量 4.7 寄存器变量 4.8 分程序结构 4.9 初始化 4.10 递归 4.11 C预处理程序 ...

Global site tag (gtag.js) - Google Analytics