《C语言中extern关键字详解》由会员分享,可在线阅读,更多相关《C语言中extern关键字详解(5页珍藏版)》请在人人文库网上搜索。
1、C 语言中 extern 关键字详解作者:华清远见武汉华嵌 技术支持 曹伟东内容清单:1. 用 extern 声明外部变量(1) 在一个文件内声明的外部变量(2) 在多个文件中声明外部变量(3) 在多个文件中声明外部结构体变量2. 用 extern 声明外部函数3. 总结1 用 extern 声明外部变量 定义:外部变量是指在函数或者文件外部定义的全局变量。 外部变量定义必须在所有的函 数之外,且只能定义一次。( 1) 在一个文件内声明的外部变量 作用域:如果在变量定义之前要使用该变量,则在用之前加 extern 声明变量,作用 域扩展到从声明开始,到本文件结束。例子:#include int。
2、 max(int x,int y);/ 函数提前声明int main(int argc,char *argv )int result;extern int X; / 外部变量声明extern int Y;result = max(X,Y); printf(the max value is %dn,result); return 0;int X = 10;/定义外部变量int Y = 20;int max(int x, int y)return (xy ? x : y);其中,用 extern 声明外部变量时,类型名可以省略。例如, “ extern int X; ”,可以改 写成“ exter。
3、n X ;”。小结:这种用方法简单,实用性不大。( 2) 在多个文件中声明外部变量作用域: 如果整个工程由多个文件组成, 在一个文件中想引用另外一个文件中已经 定义的外部变量时,则只需在引用变量的文件中用 extern 关键字加以声明即可。可见, 其作用域从一个文件扩展到多个文件了。例子:文件 a.c 的内容:#include int BASE=2;/变量定义int exe(int x);/外部函数提前声明int main(int argc, char *agrv)int a=10;prin tf(%dA%d = %dn,BASE,a,exe (a);return 0;文件 b.c 的内容:#。
4、include extern BASE;/外部变量声明int exe(int x)int i;int ret=1;for(i=0;i#include b.h#include c.hA_class local_post=1,2,3;/ 全局变量A_class next_post=10,9,8;/全局变量int main(int argc,char *argv)A_class ret;print(first point,local_post); print(second point,next_post); ret=fun(local_post,next_post);printf(the vecto。
5、r is (%d,%d,%d)n,ret.x,ret.y,ret.z); return 0;文件 b.h 的内容:#ifndef __B_H#define __B_H#if 1typedef structint x;int y;int z;A_class;#endifextern A_class local_post; /外部结构体变量声明extern A_class fun(int x,int y,int z);/接口函数声明#endif文件 b.c 的内容:#include #include b.hA_class fun(A_class first,A_class next)A_class。
6、 ret;ret.x=next.x-first.x;ret.y=next.y-first.x;ret.z=next.z-first.z;return (ret);文件 c.h 的内容:#ifndef __C_H#define __C_Hextern int print(char *,A_class post);#endif文件 c.c 的内容:#include #include b.hint print(char *str,A_class post)printf(%s : (%d,%d,%d)n,str,post.x,post.y,post.z);return 0;禾U用 gcc工具编译 gc。
7、c a.c b.c c.c-o demo, 再运行./demo, 结果为first point : (1,2,3)second point : (10,9,8)the vector is (9,8,5)小结:在a.c文件中定义全局变量A_class local_post结构体,并且调用 b.c中的接口函数 A_class fun(int x,int y,int z)和 c.c 中 int print(char *str,A_class post),在 b.h 中声明外部结构 体变量local_post,同时,需要对其类型 A_class进行实现,在b.h文件中,如果屏蔽掉 A_class 的实。
8、现,而在 b.h 以外的文件中实现,此时编译时就会出错,由于c.c 文件中用到 A_class定义的类型,所以需要在该文件中包含 b.h。这里需要说明的是, 如果调用外部结构体等多层结构体变量时,需要对这种变量进行实现,使用时,加上模块的头文件即可,否则会报错。实际工程中,模块化程序文件,一般提供一个.c和一个.h文件,其中.h文件被.c文件调用, .h 文件中实现。2 用 extern 声明外部函数a 定义函数时,在函数返回值类型前面加上 extern 关键字,表示此函数时外部函数, 可供其他文件调用,如extern int func (int x,int y) , C语言规定,此时 ext。
9、ern可以省略,隐形为外部函数。b 调用此函数时,需要用 extern 对函数作出声明。作用域: 使用 extern 声明能够在一个文件中调用其他文件的函数, 即把被调用函数的作用域 扩展到本文件。 C 语言中规定,声明时可以省略extern。例子:文件a.c的内容:#include #include b.hint main()int x=10,y=5;printf(x = 10,y = 5n);printf(x + y = %dn,add(x,y);printf(x - y = %dn,sub(x,y);printf(x * y = %dn,mult(x,y);printf(x / y = 。
10、%dn,div(x,y);return 0;文件 b.h 的内容:#ifndef __F_H#define __F_Hextern int add(int x,int y);extern int sub(int x,int y);extern int mult(int x,int y);extern int div(int x,int y);#endif文件 b.c 的内容:#include int add(int x,int y)return(x+y);int sub(int x,int y)return(x-y);int mult(int x,int y)return(x*y);int d。
11、iv(int x,int y)if(y!=0)return(x/y);printf(mult() fail!the second para can not be zero!n ); return(-1);禾U用 gcc工具编译 gcc a.c b.c -o demo, 再运行./demo, 结果为x = 10,y = 5x + y = 15x - y = 5x * y = 50x / y = 2。小结:由上面简单的例子可以看出,在b.h文件中声明好b.c的函数,使用时,只需要在a.c中包含#inelude b.h”头文件即可,这样就可以使用b.c的接口函数了,在实际工程中,通常也是采用这种方式。
12、,.c文件中实现函数,.h文件中声明函数借口,需要调用.c文件的函数接口时,只需包含 .h 头文件即可。3. 总结在实际工程中,有两种情况比较多。 一是利用extern只声明外部函数,不需要传递需要 外部声明的变量,一个模块化接口文件对应一个声明接口的头文件,需要调用接口函数时, 只需要包含其头文件。 二是禾用用 extern 声明外部函数, 同时声明需要传递的外部变量, 做 法和第一种情况一样,声明都放在头文件中,但是,模块文件也需要包含该头文件。另外, 如果结构体等比较复杂的变量, 则需要包含其定义的头文件。 另外, 定义的外部变量属于全 局变量,其存储方式为静态存储,生存周期为整个程序的生存周期。