深入理解作用域、链接、存储期

标题作为基础概念的作用域,链接、存储期

作用域:scope
Each identifier that appears in a C program is visible (that is, may be used) only in some possibly discontiguous portion of the source code called its scope.
这样定义的目的就是每个标识符,在源文件的某些部分能否引用相关的标识符。
作用域分四类:
1:块作用域(block scope)
2:文件作用域(file scope)
3:函数作用域(function scope)
4:函数原型作用域(function prototype scope)

块作用域:
块的定义为{}括起来的部分,不了是函数定义,struct,还是在内部定义,只有{}括起来的,都是block

int c1=5;
{ 
int c1=4;
printf("c1=%d",c1);
}
printf("c1=%d",c1);

文件作用域(file scope)
在函数之外的标识符或者{}之外,在整个文件是可见的,从定义或者声明开始,一直到文件结束即文件内的函数或者语句块均
可以引用

#include <stdio.h>
int units=0;
void calc(void); //declaration
int main(int argv,char**argv){
//...
}
//definination
void calc(void){ 
units=10;//units,在这个函数也是可见的
//...

函数作用域

char getChar(char *c){
	int i=0;
	for (i=0;i<10;i++){
		int j=0;
		j=i+j;//j block scope,
	}
	//j=10; error ,j is invisible 
	return i;
}

函数原型作用域

int setValue(int pos,char *string);
//declaration, 在声明时可以忽略,
int setValue(int,char*)
//在函数定义时在写上具体的参数名

链接:Linkage refers to the ability of an identifier (variable or function) to be referred to in other scopes
三种链接属性
外部链接、内部链接或无链接
外部链接:表明identifier是符号表中的符号,作为一个符号能在其他文件进行链接时,视为符号表,进行链接进来
内部链接:严格意义上应当是文件作用域的变量,加上了static,表明此标识符不能用于外部文件。
无链接:即不是文件作用域的identifier。可以理解为块作用域,函数作用域或函数原型作用域。

存储期(storage duration)
auto:automatic duration and no linkage ()
register:automatic duaration and no linkage;address of this variable cannot be taken
static:static duration and internal linkage(unless at block scope)
extern:static duration and external linkage(unless already declared internal)
_Thread_local:thread storage duration

extern int valuePos;
void getValue(int pos,char * src)
{
	static int posPre=9;
	extern int posIn;	
}

三者之间的联系和区别:
1:看一个标识符,首先要看作用域,在作用域范围,在看对应的存储期和链接类型
对文件作用域的,用static和extern只是来确定其链接类型,不是用来限定存储期的,其存储期对应的就是static storage duration
对块作用域的,其链接类型是无链接,对应的存储期是automatic,即在块作用域之外,其lifecycle已经结束。如果用static来修饰块作用域的identifer,表明只是块作用域有效,但对编译单元而已,在编译时会放入目标文件的数据段,用extern来修饰identifier,只是表明这个identifier在外部进行定义,编译时进行留空,在链接时引入其他目标文件的符号,找到位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值