• extern关键字的使用


    A.置于变量或者函数前,以标示变量或者函数的定义在别处,提示编译器遇到此变量和函数时在其他地方寻找其定义。

    B.可用来进行链接指定。

    1.使用extern声明外部变量

    1.1在一个文件内声明外部变量

      外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。编译时将外部变量分配在静态存储区。

      如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件结束。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。

     1 int max(int x,int y)
     2 {
     3     int z;
     4     z=x>y?x:y;
     5     return(z);
     6 }
     7 
     8 main()
     9 {
    10     extern A,B;
    11     printf("%d
    ",max(A,B));
    12 }
    13 
    14 int A=13,B=-8;

      说明:在本程序文件的最后1行定义了外部变量AB,但由于外部变量定义的位置在函数main之后,因此本来在main函数中不能引用外部变量AB。现在我们在main函数中用externAB进行“外部变量声明”,就可以从“声明”处起,合法地使用该外部变量AB

      extern声明外部变量时,类型名可以写也可以省写。例如,“extern int A,B;”也可以省写为“extern A,B;

    1.2 在多文件的程序中声明外部变量

      如果程序由多个源程序文件组成,那么在一个文件中想引用另一个文件中已定义的外部变量,有什么办法呢?

      如果一个程序包含两个文件,在两个文件中都要用到同一个外部变量Num,不能分别在两个文件中各自定义一个外部变量Num,否则在进行程序的连接时会出现“重复定义”的错误。正确的做法是:在任一个文件中定义外部变量,而在另一文件中用externNum作“外部变量声明”。在编译和连接时,系统会由此知道Num是一个已在别处定义的外部变量,并将在另一个文件中定义的外部变量的作用域扩展到本文件,在本文件中可以合法地引用外部变量Num

    1.3 具体使用方法

      在XXX.c中定义一个全局变量,在相应的XXX.h中使用extern对该变量进行声明。注意声明的时候不能进行初始化。如果其它文件中需要用到该全局变量,只需使用#include”XXX.h”包含头文件即可。

    2.使用extern声明外部函数

    (1) 在定义函数时,如果在函数首部的最左端加关键字extern,则表示此函数是外部函数,可供其他文件调用。C语言规定:如果在定义函数时省略extern,则隐含为外部函数。

    (2) 在需要调用此函数的文件中,用extern对函数作声明,表示该函数是在其它文件中定义的外部函数。

    (3) 由于函数在本质上是外部的,在程序中经常要调用外部函数,为方便编程,C语言允许在声明函数时省写extern。由此可进一步理解函数原型的作用(不必使用extern),函数原型通知编译系统:该函数在本文件中稍后定义,或在另一文件中定义。

    (4) 具体使用方法:在XXX.c中定义一个函数,在相应的XXX.h中使用extern对该函数进行声明。如果其它文件中需要用到该函数,只需使用#include”XXX.h”包含头文件即可。

    3.使用extern进行链接指定

      在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,应该如何解决这种情况呢?

      C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。

    下面是一个标准的写法:

     1 //在.h文件开始声明函数原型的地方
     2 #ifdef __cplusplus
     3 #if __cplusplus
     4 extern "C"{
     5 #endif
     6 #endif /* __cplusplus */ 
     7 ...
     8 ...//函数原型
     9 ...
    10 //.h文件函数原型结束的地方
    11 #ifdef __cplusplus
    12 #if __cplusplus
    13 }
    14 #endif
    15 #endif /* __cplusplus */ 

     

  • 相关阅读:
    「SOL」工厂选址(BZOJ)
    「NOTE」数论小札
    Flask实现简单的群聊和单聊
    python基础总结
    基于Flask和百度AI实现与机器人对话
    django创建路径导航
    django中权限控制到按钮级别
    django中非菜单权限的归属
    MongoDB的增删改查
    jQuery于js的区别和联系
  • 原文地址:https://www.cnblogs.com/Camilo/p/3765494.html
Copyright © 2020-2023  润新知