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

转自:http://blog.csdn.net/xlinsist/article/details/46639311

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链接属性的声明了。

变量的存储类型是指存储变量值的内存类型。变量的存储类型决定变量何时创建、何时销毁以及它的值将保持多久。有三个地方可以用于存储变量:普通内存、运行时内存、运行时堆栈、硬件寄存器。

静态变量:凡是在任何代码块之外声明的变量总是存储于静态内存中,也就是不属于堆栈的内存。

自动变量:在代码块内部声明的变量缺省存储类型是自动的,它存储于堆栈中。如果给它加上static关键字,可以使它的存储类型从自动变为静态,但是它并不修改该变量的作用域。

寄存器变量:关键字register可以用来自动变量的声明,提示它们应该存储于机器的硬件寄存器而不是内存中。


总结:当static关键字用于不同的上下文环境时,具有不同的意思。上面已经提到,当它用于代码块之外的变量声明时,或用于定义函数时,static关键字用于修改标识符的链接属性,从external改为internal,但标识符的存储类型和作用域不受影响。

当它用于代码块内部的声明时,static关键字用于修改变量的存储类型,从自动变量修改为静态变量,但变量的链接属性和作用域不受影响。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值