您的位置:首页 > 编程语言 > C语言/C++

详解C语言external-internal-none链接属性

2015-06-25 08:58 204 查看
external(外部) 这种链接属性的标识符无论声明多少次,位于几个源文件都表示一个实体。例如下面的代码:

文件名为main.c

#include <stdio.h>

int studentid;


文件名为test.c

#include <stdio.h>

int studentid;


文件名为var.c

#include <stdio.h>

int var() {

  extern int studentid;

}


在缺省情况下,标识符studentid的链接属性为external,如果像这样声明,编译器在编译的时候将会报错(multiple definition of ‘studentid’)。var.c中的studentid由于加上了extern关键字,那么它访问的就是其它源文件声明的外部变量了。

internal(内部) 这种链接属性的标识符在同一个源文件内的所有声明中都指同一个实体,但位于不同源文件的多个声明则分属不同的实体。例如下面的代码:

文件名为main.c

#include <stdio.h>

static int studentid;


文件名为test.c

#include <stdio.h>

static int studentid;

void test() {

  extern int studentid;

}


在缺省情况下,标识符studentid的链接属性为external,但是,加上static关键字以后,studentid的链接属性就变为了internal, 像这样声明没有任何问题。test.c文件中test函数中的studentid虽然有extern关键字,但是它并不会更改由第一次声明所指定和链接属性。也就是说它使用的是上面声明的static的那个变量。

none(无) 这种链接属性的标识符总是被当作单独的个体。例如下面的代码:

文件名为main.c

#include <stdio.h>

int main() {

  int studentid;

}


文件名为test.c

#include <stdio.h>

int test() {

  int studentid;

}


studentid的链接属性为none

总结:

1. static关键字只对缺省链接属性为external的声明才有改变链接属性的效果。

2. extern关键字用于第一次声明时,它可以改变其链接属性,但是第2次或以后的声明将不会起作用。

3.凡是在任何代码块之外声明的变量其缺省链接属性为external,加上static关键字以后就将其链接属性改为internal,在函数内部或者代码块内部的声明其链接属性为none,加上extern关键字以后就可以引用外部文件定义的具有external链接属性的声明了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息