[C语言基础]作用域,链接,存储周期

本文详细介绍了C语言中标识符的作用域,包括函数域、文件域、块域和函数原型域,并阐述了链接的三种类型:内部链接、外部链接和空链接。同时,讨论了对象的存储时期,包括静态生命周期和自动生命周期,深入理解这些概念对于编写清晰、高效的C语言代码至关重要。
摘要由CSDN通过智能技术生成


九层之台,起于累土。


作用域

作用域:Scope of Identifiers。

同一标识符指定的不同实体要么具有不同的作用域,要么在不同的命名空间

标准C定义了4个域:

  1. function(函数域)
  2. file(文件域)
  3. block(块域)
  4. function prototype(函数原型域)
function–函数域

函数域是指:从某函数的开始到函数的结束的一段范围。
标签 是唯一具有函数域的标识符类型。这意味着无论标签出现在该函数的什么地方,其对该函数的任何位置的代码都是可见的。

#include<stdio.h>
...

void test()
{
	if(...)
		goto label;
label: /* label具有函数域 */
	...
}
file–文件域

如果某标识符的声明出现在所有的块或者参数列表之外,则具有文件域。
文件域的范围从标识符声明处开始,到包含该声明的文件结尾处。

#include<sdtio.h>
...
int a; /* a具有文件域*/
void test()
{
	...
}
block–块域

如果某标识符的声明出现在块或函数定义中的参数声明列表中,则其具有块域。
块域的范围从标识符声明开始,到块的末尾结束。

#include<stdio.h>
...
void test(int a)
{
	int b; /* a,b具有块域,到函数末尾结束*/
	if(...)
	{
		int c; /* c具有块域,到if控制的块的末尾结束*/
	}
}
function prototype–函数原型域

如果某标识符的声明在函数声明的列表中,则其具有函数原型域。
函数原型域的范围一直到函数原型声明的末尾。

#include<stdio.h>
...
void test(int a); /* a具有函数原型域 */

链接

链接:Linkage of Indentifiers

作用域是由编译器处理的属性,链接是由链接器处理的属性。

链接是一种属性,它描述了链接器如何链接标识符,是否只能在声明的文件中使用?是否可供另一个文件使用?…

链接有3种:
1.内部链接
2.外部链接
3.空链接

内部链接

如果一个具有文件作用域的对象或者函数的声明包含static,则该标识符具有内部链接。
内部链接只能在声明该标识符的文件内使用。

#include<stdio.h>
...
static int a; /* a具有内部链接*/
static void test(); /* test函数具有内部链接 */
外部链接

外部链接是具有文件作用域的对象或函数的默认属性,可以在一个多文件程序的任何地方使用。
extern可以指定一个标识符具有外部链接,如果extern声明的标识符的先前声明可见并指定了内部或外部链接,则这个声明的标识符与之前声明的标识符的链接相同,如果没有可见的先前声明或者先前声明没有指定链接,则标识符具有外部链接。

#include<stdio.h> /* a.c */
int a;

...

#include<stdio.h> /* b.c */
extern int a;
空链接

具有块作用域和函数原型作用域的对象具有空链接。


存储时期

存储时期又叫生命周期,针对的是对象。
有2种生命周期:
1.static–静态生命周期
2.automatic–自动生命周期

static–静态生命周期

具有文件作用域,或者带有static声明的对象具有静态生命周期,它的生命周期是程序的整个执行过程,它的值只在程序开始初始化一次。

#include<stdio.h>
...
int a; /* a具有静态生命周期 */
void test()
{
	static int b; /* b具有静态生命周期 */
}
automatic–自动生命周期

非文件作用域且没有static声明的对象具有自动生命周期。
具有自动生命周期的对象的生命周期,从定义对象开始,直到代码执行到该对象作用域的结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值