作用域和链接属性

简介: 作用域和链接属性

作用域和链接属性

 

作用域

当变量被定义在程序的不同位置时,它的作用范围是不一样的,这个作用范围就是我们所说的作用域。

 

C语言编译器可以确认4种不同类型的作用域:

一代码块作用域

一文件作用域

一原型作用域

一函数作用域

 

1)  代码块作用域(block scope

在代码块中定义的变量,具有代码块作用域。作用范围是从变量定义的位置开始,到标志该代码块结束的右大括号)处。

 

尽管函数的形式参数不在大括号内定义,但其同样具有代码块作用域,隶属于包含函数体的代码块。

include<stdio.h>

int main(void)

{

int i = 100; //i1

{

int i = 110;//li

{

int i = 120;//i3

printf ( "i = %d\n", i);

}

//i =110

{

printf ( "i=%d\n", i);

int i = 130;

printf ( "i=%d\n", i);

}

printf ("i=%d \n", i);

}

printf("i= %d\n", i);

return 0;

}

 

 

 

2)  文件作用域(file scope)

任何在代码块之外声明的标识符都具有文件作用域,作用范围是从它们的声明位置开始,到文件的结尾处都是可以访问的。

 

另外,函数名也具有文件作用域,因为函数名本身也是在代码块之外。

#include <stdio.h>

void func(void);

int main(void)

{

extern int count;

func();

count++;

printf( "In main, count = %d \n", count);

return 0;

}

int count;

void func(void)

{

count++;

printf( "In func, count = %d \n", count);

}

 

3)  原型作用域(prototype scope)

原型作用域只适用于那些在函数原型中声明的参数名。

例如:

image.png

函数在声明的时候可以不写参数的名字(但参数类型是必须要写上的),其实函数原型的参数名还可以随便写一个名字,不必与形式参数相匹配(当然,这样做没有任何意义!)

 

4)  函数作用域(function scope)

函数作用域只适用于goto语句的标签,作用将goto语句的标签暖制在同一个函数内部,以及防止出现重名标签。

 

  • 定义和声明

当一个变量被定义的时候,编译器为变量申请内存空间并填充一些值。

当一个变量被声明的时候,编译器就知道该变量被定义在其他地方。

声明是通知编译器该变量名及相关的类型已存在,不需要再为此申请内存空间。

 

局部变量既是定义又是声明。

 

定义只能来一次,否则就叫做重复定义某个同名变量;而声明可以有很多次。

 

  • 链接属性

image.png

external(外部的)

一多个文件中声明的同名标识符表示同一个实体

internal(内部的)

一单个文件中声明的同名标识符表示同一个实体

none(无)

一声明的同名标识符被当作独立不同的实体

 

只有具备文件作用域的标识符才能拥有externalinternal的链接属性,其他作用域的标识符都是none属性。

 

默认情况下,具备文件作用域的标识符拥有external属性。也就是说该标识符允许跨文件访问。对于external属性的标识符,无论在不同文件中声明多少次,表示的都是同一个实体。

 

#include <stdio.h>

void a(void) ;

void b(void);

void c(void);

int count;

int main(void)

{

a();

b();

c();

b();

printf("小郭今天一共被抱了%d\n", count);

return 0;

}

 

  • 全局变量

extern int count;

void b (void)

{

           count++;

}

 

使用static关键字可以使得原先拥有external属性的标识符变为internal属性。

 

这里有两点需要注意:

-使用static关键字修改链接属性,只对具有文件

作用域的标识符生效(对于拥有其他作用域的标识符是另一种功能)

 

一链接属性只能修改一次,也就是说一旦将标识符的链接属性变为internal,就无法变回external

相关文章
|
人工智能 自动驾驶 编译器
英伟达发布 Hopper H100 新架构芯片:面向 AI、自动驾驶汽车及 Metaverse 领域
英伟达发布 Hopper H100 新架构芯片:面向 AI、自动驾驶汽车及 Metaverse 领域
1663 0
英伟达发布 Hopper H100 新架构芯片:面向 AI、自动驾驶汽车及 Metaverse 领域
|
10月前
|
C语言
【C语言程序设计——循环程序设计】统计海军鸣放礼炮声数量(头歌实践教学平台习题)【合集】
有A、B、C三艘军舰同时开始鸣放礼炮各21响。已知A舰每隔5秒1次,B舰每隔6秒放1次,C舰每隔7秒放1次。编程计算观众总共听到几次礼炮声。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。开始你的任务吧,祝你成功!
227 13
|
设计模式 前端开发 C语言
【设计模式】 观察者模式介绍及C代码实现
观察者模式(Observer Pattern)是一种常用的设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有观察者都会收到通知并更新自己的状态。观察者模式又称为发布-订阅模式。Subject(主题):被观察的对象,它将所有观察者对象的引用保存在一个集合中,并提供了添加和删除观察者对象的方法。Observer(观察者):观察者接口,定义了更新自己的状态的方法,以便主题在状态发生变化时通知观察者。ConcreteSubject(具体主题)
692 0
【设计模式】 观察者模式介绍及C代码实现
|
Ubuntu 安全 Oracle
2023 年 10 个最佳 Linux 服务器发行版,你知道几个?
2023 年 10 个最佳 Linux 服务器发行版,你知道几个?
12457 1
2023 年 10 个最佳 Linux 服务器发行版,你知道几个?
|
IDE 编译器 Linux
你应该搞懂的 C 语言头文件路径问题
聊聊系统路径位置,绝对路径与相对路径,正斜杠 `/` 与 反斜杠 `\` 使用说明 ...... by 矜辰所致
624 0
你应该搞懂的 C 语言头文件路径问题
|
算法 安全 物联网
【BLE】 BLE安全管理 - SM层剖析(2)
上一章介绍了配对流程的第一阶段,剖析了配对第一阶段的配对请求包和配对响应包的各个字段的含义和使用。接下来就进入了ble配对的阶段二,在该阶段双方会根据阶段一中的配对信息选择合适的配对和认证方式,并且生成会后续链接加密的密钥。
595 1
【BLE】 BLE安全管理 - SM层剖析(2)
|
安全 数据挖掘 芯片
聊聊电源自动切换电路(常用自动切换电路总结)
今天得聊聊电源自动切换电路,实际中需要使用并且用过,那就来记录总结一下。
699 1
聊聊电源自动切换电路(常用自动切换电路总结)
|
安全 关系型数据库 芯片
全面认识MOS管,一篇文章就够了
础知识中 MOS 部分迟迟未整理,实际分享的电路中大部分常用电路都用到了MOS管,今天势必要来一篇文章,彻底掌握mos管!
2295 1
全面认识MOS管,一篇文章就够了
|
传感器 安全 vr&ar
全面认识二极管,一篇文章就够了
电子设计基础元器件 二极管,小小二极管,大大用途。二极管作为最基础的晶体管,在电子电路应用中无所不在,不管是电平转换电路,电源自动切换电路,防反接电路,都有二极管的影子。
1725 1
全面认识二极管,一篇文章就够了
|
机器学习/深度学习 程序员 C语言
传递结构体变量和结构体指针
传递结构体变量 传递指向结构体变量指针 动态申请结构体 建成图书馆
传递结构体变量和结构体指针