C和指针 第三章 链接属性 extern、internal、none

三种链接属性

  组成一个程序有多个源文件,如果相同的标识符出现在多个源文件中,那么标识符的链接属性决定如何处理在不同文件中出现的标识符。

  链接属性有三种:

external:外部   多个源文件中的相同标识符指向同一个实体

internal:内部  同一个源文件中标识符指向同一个实体

none:无     当做单独的实体,只有在代码块内部出现,每次出现都是不同的独立实体。

typede char *a;
int b;
int c(int d)
{
    int e;
    int f(int g);
}

  其中,b,c和f为external属性,其他均为none。内部代码块和形参都是none属性。

  只要变量并非声明于代码块或函数定义内部,他在缺省情况下链接属性为external储存类型为静态储存代码块内部使用extern可以使用它所引用的值是全局变量而非局部变量。

改变链接属性

关键词:externstatic用于修改标识符的链接属性。 

  当给b加上,static就就可把external属性,改变为internal属性。使得b是当前源文件的私有变量。

  注意static只对链接属性为external的声明有效,如果对上面的e加上static是没有效果的,因为e的默认链接属性是none,而不是external。

  extern为标识符指定external属性,这样就可以访问在其他位置定义的实体。

static int i;
int function()
{
    int j;
    extern int k;
    extern int i;
}

  上面的声明k的external属性,这样既可以访问在其他地方定义的k实体了。当具有文件作用域时,这个关键词是可选的,不过加上extern可以让其他人更倾清晰的明白你的意图

  当extern用于源文件中一个标识符第一次声明时时表示有external属性,但是第二次或者第三次,它不会更改由第一次声明所指定的链接属性。上面的i,第一次由static修饰的internal属性,随后extern int i;并不修改i的internal链接属性。

原文地址:https://www.cnblogs.com/yangxunwu1992/p/5767624.html