C语言 链接属性

  1.什么是链接属性?

     当组成一个程序的各个源文件分别被编译后,所有的目标文件以及那些从一个或多个函数库中引用的函数链接在一起,形成可执行程序.

   标识符的链接属性决定如何处理在不同文件中出现的标识符.标识符作用域与它的链接属性有关,但这两个属性并不相同.

  2.链接属性分为三种:

          (1)external(外部):external链接属性的标识符不管声明几次,存在于多少个源文件,都是属于一个个体.

     (2)internal(内部):internal链接属性的标识符在同一个源文件内所有声明都是同一个个体,但在其他源文件中多个声明分属不同个体.

          (3)none(无):没有链接属性的标识符(none)总是当成单独个体,也就是多次声明被当做多个不同的实体.

  3.缺省情况下,函数和代码块之外的标识符链接属性为external,代码块之内的标识符链接属性为none.下面的程序骨架所示.

1    int a;
2    int b(int c)
3    {
4        int e;
5        int f(int g);
6    }

   

    在缺省情况下,a,b,f为external链接属性.其余标识符为none链接属性.

    所以如果当其他源文件声明了标识符a,实际上是访问的这个源文件中所定义的实体.f的链接属性之所以是external,是因为他是函数名,调用f函数实际上将链接到其他源文件所定义的函数,甚至这个函数的定义    是在某个函数库中.

  4.用于在声明中修改标识符链接属性的关键字:extern和static

         static:(1)对于缺省情况下为external链接属性的声明,在声明前加static,会使这个标识符变成这个源文件私有,这样可以防止它被其他源文件调用.

         (2)对于缺省情况下为none链接属性的声明,在声明前加static,不会改变这个标识符的链接属性,也不会改变它的作用域,但会改变它的存储类型(生命周期),让它在程序执行的整个过程中一直存在.

        extern:(1)在声明前加extern,会为这个标识符指定external链接属性.这样就可以在其他源文件声明的外部定义这个实体.比如下面k声明为extern时,函数就可以访问其他源文件声明的外部变量了.

1 int fun()
2   {
3     int i;
4     extern int k;
5   }

             (2)如果标识符在第一次声明中已经指定了链接属性,那么extern在后面的第二次或以后的声明中,不会更改第一次声明所指定的链接属性.如下所示,i在第一次声明中已经指定了internal链接属性,在函数内的第二次声明并不会将链接属性internal变为external.

1 static int i;
2     int fun()
3     {
4         extern int i;
5     }
原文地址:https://www.cnblogs.com/Duikerdd/p/9880190.html