• C语言中extern的用法


     

     

      extern用在变量或函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。

      extern修饰变量的声明。

      举例:若a.c中需引用b.c中的变量int v,可以在a.c中声明extern int v,然后就可以引用变量v;需要注意的是,被引用的变量v的链接属性必须是外

    链接(external)的,也就是说a.c要引用到变量v,不只是取决于在a.c中声明extern int v,还取决于变量v本身是能够被引用到。这里涉及到另外一个话

    题---变量的作用域。能够被其他模块以extern引用到的变量通常是全局变量。

      extern int v可以放在a.c中的任何地方,比如可以在a.c中函数func()定义的开头处声明extern int v,然后就可以引用到变量v了,

    只不过这样只能在func()作用域中引用变量v。

    另外一点要说明的是在b.c中需要对int v 做什么处理吗?那就是不能定义成静态变量static int v,否则不能使用。

    fileb.c

    static int A;

    int main()

    {

    ...

    }

    filea.c

    extern A;

    {

      A = A*n; //出错

    }

    另外有人会有疑问为什么不在b.v文件中声明extern A;这样可以表示出A的特殊性,仔细想想真的不需要。

     

       extern修饰函数的声明。

      本质上讲,变量和函数没有区别。函数名是指向函数二进制块开头处的指针。如果文件a.c要引用b.c中的函数,比如在b.c中原型是int func(int m),那么就可以在a.c中声明extern int func(int m),然后就能使用func()来做任何事情。就像变量的声明一样,extern int func(int m)可以放在a.c中的任何位置,而不一定非要放在a.c的文件作用域的范围中,

      对其他模块中函数的引用,最常用的方法是包含这些函数声明的头文件。使用extern和包含头文件来引用函数的区别:extern的引用方式比包含头文件要间接得多。extern的使用方法是直接了当的,想引用哪个函数就用extern声明哪个函数。这大概是kiss原则的一种体现。这样做的一个明显的好处是,会加速程序的编译(确切地说是预处理)的过程,节省时间。在大型C程序编译过程中,这种差异是非常明显的。

     

      此外,extern修饰符可用于指示C或者C++函数的调用规范。比如在C++中调用C库函数,就需要在C++程序中用extern "C"声明要引用的函数。这是给链接器使用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后再目标代码中命名规则不同。

     

    0x05

      简要例子:

    复制代码
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 int x = 0;
     5 int y = 5;
     6 int func1()
     7 {
     8     extern p, q;
     9     printf("p is %d, q is %d
    ", p, q);
    10     return 0;
    11 }
    12 
    13 int p = 8;
    14 int q = 10;
    15 int main()
    16 {
    17     func1();
    18     printf("x is %d, y is %d
    ", x, y);
    19 }
    复制代码

     

    输出结果:

      

  • 相关阅读:
    第二册二十一课
    第二册第二十课
    第二册第十九课
    第二册第十八课
    あなたがいるから (因为有你)
    flash 概要分析器
    this与回调函数
    cpp可变参笔记
    struct详解
    函数传递小结
  • 原文地址:https://www.cnblogs.com/zhongguo135/p/9489081.html
Copyright © 2020-2023  润新知