济南网站制作推广,山西省经济建设投资公司网站,什么行业做网站合适,北京建设局投诉网站首页C程序由一组对象组成#xff0c;这些对象包括程序中所使用的变量和实现特定功能的函数。变量可以分为函数内部定义、使用的变量和函数外部定义的变量#xff0c;通常情况下#xff0c;把函数内部定义、使用的变量称为内部变量或局部变量#xff0c;而将在函数外部定义的、供…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 */ 复制代码外部变量变量定义在其他文件中全局变量
extern可以置于变量或者函数前以表示变量或者函数的定义在别的文件中提示编译器遇到此变量和函数时在其他模块中寻找其定义。C语言外部变量的使用以及extern的用法 C语言的外部变量的定义和引用对初学者来说,是个难点.对外部变量的说明和定义不是一回事.对外部变量的说明,只是声明该变量是在外部定义过的一个全局变量..在这里引用.而对外部变量的定义,则是要分配存储单元.一个全局变量只能定义一次,却可以多次引用.用extern声明外部变量,目的是可以在其它的文件中调用.具体使用见下面的例子: file1.c file2.c int i,j;//定义全局变量 extern int i,j;//外部变量说明 char c; extern char c; void func() void func1() { { } }在file2.c中对外部变量i,j,c进行了说明,就可以直接调用file1.c中定义的全局变量了静态变量static的使用有时在中断程序中定义了变量,不希望每次进入中断程序,变量就被赋初值.这时就要使用static变量.静态局部变量在编译时赋初值,既只赋初值一次.见下例: void serial_interrupt() interrupt 4 using 3{ static uchar i0; i;}上例中,编译时,i被赋初值0,以后每进入一次中断,i1,而不是每次进入中断,i都被请零,再加1如果在a.c中要调用在b.c中定义的函数func需要在a.c中声明该函数表示该函数在别的源文件中定义。函数是可以互相调用的因此函数都具有外部存储种类的属性。原则上调用一个在在本程序模块文件以外的其他模块文件所定义的函数必须用关键字extern说明被调用函数是一个外部函数。实际使用中可以省掉extern。即下面两个函数声明没有明显的区别extern int f();和int f();例如;#include 2.hextern int a;int _tmain(int argc, _TCHAR* argv[]){ test(); printf(%d\n,a); return 0;} #include 2.h int a;int test(){ a10; return 0;} //结果a10;