C语言中变量和函数的作用域和链接属性
C语言中变量和函数的作用域和链接属性
作用域
代码块作用域: 代码块指的是使用“{}”包围起来的部分。
- 在代码块中定义的变量,代码块之外是不能访问的。
- 代码块嵌套之后的变量作用域,子代码块中定义的同名变量会覆盖父代码块中的同名变量。
#include <stdio.h>
int main(){
{
int i=0;
printf("%d\n",i);//0
{
int i=1;
printf("%d\n",i);//1
}
}
}
函数原型作用域: 函数原型作用域仅包括函数原型形式参数所在的括号。该作用于主要强调声明函数时不能使用相同名称的形式参数。
函数作用域: 函数作用域指的就是函数体的部分。K&R C的函数体不包含函数参数,所以在函数体内定义和函数参数同名变量会替代函数参数。ANSI C修改了该问题,函数参数在函数体的最外层作用域之内。
- 函数作用域内定义的变量,在函数之外不能进行访问。
文件作用域: 源文件所在的范围。
- 所有代码块之外定义的标识符就有文件作用域。(全局变量)
- 函数名不属于任何任何代码块,因此也具有文件作用域。
链接属性
- 当组成一个程序的所有源文件被编译之后,所有目标文件以及那些从一个或多个函数库中引用的函数链接在一起,组成可执行文件。问题是当相同的标识符出现在不同的源文件时该怎么办?标识符的链接属性用来处理不同源文件中出现的标识符。标识符的链接属性和它的作用域有关但并不相同。
none(无): 总是被当做单独个体,也就是说该标识符在不同源文件中的多次声明之间毫无关系,分属不同的实体。
- 代码块之内定义的变量默认具有none连接属性。通过extern修饰符可以修改为外部链接属性,这样就可以访问其他源文件中定义的外部变量了。static修饰符不能修改连接属性和作用域,只修改存储类型。
#include <stdio.h>
int main(){
{
static int i=0;
printf("%d\n",i);//0
}
printf("%d\n",i);//error: ‘i’ undeclared (first use in this function)
}
- 代码块之内定义的变量默认具有none连接属性。通过extern修饰符可以修改为外部链接属性,这样就可以访问其他源文件中定义的外部变量了。static修饰符不能修改连接属性和作用域,只修改存储类型。
internal(内部): 在同一个源文件中的所有声明指向同一实体,不同源文件指向不同实体。全局变量和函数可以通过static修饰符从外部链接属性改为内部链接属性。
external(外部):在所有源文件中指向同一实体。全局变量和函数默认具有全局作用域,可以通过extern将从未显式声明链接属性的标识符修改为外部链接属性。
- static关键字可以将全局变量和函数修改为内部连接属性。
- 全局变量默认为外部链接属性:
main.c
#include <stdio.h>
int i;
int main(){return 0;};
test.c
#include <stdio.h>
int i=0;
gcc -c main.c test.c //success
gcc -o main main.o test.o //multiple definination of "i"
main.c修改:
#include <stdio.h>
extern int i;//通过使用extern将该全局变量声明为外部链接属性,使用外部定义的变量。
int main(){return 0;}
gcc -o main main.o test.o //success
- 函数通过extern关键字修饰为全局连接属性,指的是该函数可能在其他源文件中进行定义。
main.c
#include <stdio.h>
extern int printHello();//仅指明该函数是在外部函数中声明定义。
int main(){
printHello();
return 0;
}
test.c
#include <stdio.h>
int printHello(){
printf("hello\n");
return 0;
}
C语言中变量和函数的作用域和链接属性的更多相关文章
- c语言中变量和函数作用域深究
首先,函数的作用域和访问权限基本可以参考 C语言中的作用域,链接属性和存储类型 也存在例外情况,比如内联函数 static inline,使用static 修饰 inline之后外部文件也可以访问内联 ...
- C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期
全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内 ...
- C语言中变量、全局变量与变量的作用域
什么是变量: 变量常量都是表征数据的一种形式:常量用来表示数据的值: 变量不仅可以用来表示数据的值:还可以用来存放数据:因为变量对应着一定的内存单元: 变量和常量必须先定义后使用. 变量名和常量名都是 ...
- C语言中变量的存储类型
在C语言中,对变量的存储类型说明有以下四种: auto 自动变量register 寄存器变量extern 外部变量static 静态变量 自动变量和寄存器变量属于动态存储方式,外部变量和静态变 ...
- C语言中的作用域、链接属性与存储属性
C语言中的作用域.链接属性与存储属性 一.作用域(scope) 代码块作用域 表示{}之间的区域,下例所示,a可以在不同的代码块里面定义. #include<stdio.h> int ma ...
- C语言中返回字符串函数的四种实现方法 2015-05-17 15:00 23人阅读 评论(0) 收藏
C语言中返回字符串函数的四种实现方法 分类: UNIX/LINUX C/C++ 2010-12-29 02:54 11954人阅读 评论(1) 收藏 举报 语言func存储 有四种方式: 1.使用堆空 ...
- C语言中返回字符串函数的四种实现方法
转自C语言中返回字符串函数的四种实现方法 其实就是要返回一个有效的指针,尾部变量退出后就无效了. 有四种方式: 1.使用堆空间,返回申请的堆地址,注意释放 2.函数参数传递指针,返回该指针 3.返回函 ...
- C语言中文件定位函数总结
C语言中文件定位函数主要是:fseek, ftell, fsetpos, fgetpos. 先来讲前两个函数,这是最基本的定位函数: fseek函数:能把文件指针移动到文件任何位置,其原型是:int ...
- 关于javascript中变量及函数的提升
javascript中变量以及函数的提升,在我们平时的项目中其实还是挺常用的,尤其是大型项目中,不知不觉就会顺手添加一些变量,而有时候自己的不小心就会酿成一些不必要错误,趁有时间整理一下自己对于js中 ...
随机推荐
- SDWebImage4.0之后加载gif不显示的解决方案
SDWebImage4.0之前 UIImageView *imgView = [UIImageView new]; imgView.contentMode = UIViewContentModeSca ...
- Violet音乐社区设计文档
目录 Violet音乐社区设计文档 一.引言 1.1 编写目的 1.2 开发背景 二.用例图设计 2.1游客实例设计 2.2 管理员实例设计 2.3 普通用户实例设计 三.类图设计 3.1 歌手类 3 ...
- HTTP 简述
HTTP 简介: 1.Hyper Text Transfer Protocol(超文本传输协议),主要用于 Web 浏览器和 Web 服务器之间的通信 2.它基于 TCP/IP 通信协议来传输数据 3 ...
- Linux日志中出现大量dhclient mesage浅析
最近检查发现一台Linux服务器,发现其日志里面有大量下面信息,其中部分信息做了脱敏处理.其中一个地址A(192.168.AAA.AAA) 为DNS服务器地址,地址B(192.168.BBB.BBB) ...
- mssql 系统函数 字符串函数 space 功能简介
转自: http://www.maomao365.com/?p=4672 一.space 函数功能简介 space功能:返回指定数量的空格参数简介: 参数1: 指定数量,参数需为int类型 注意事项 ...
- 201871010113-刘兴瑞《面向对象程序设计(java)》第十周学习总结
项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址>htt ...
- [题解向] CF#Global Round 1の题解(A $\to$ G)
这里是总链接\(Link\). \(A\) 题意:求\(\sum_{i=1}^{k} a_i\times b^{k-i}\)的奇偶性, \(k = \Theta(n \log n)\) --其实很容易 ...
- python做中学(九)定时器函数的用法
程序中,经常用到这种,就是需要固定时间执行的,或者需要每隔一段时间执行的.这里经常用的就是Timer定时器.Thread 类有一个 Timer子类,该子类可用于控制指定函数在特定时间内执行一次. 可以 ...
- Selenium+java - 单选框及复选框处理
一.什么是单选框.复选框? 二.被测页面html源代码 CheckBoxRadioDemo.html <!DOCTYPE html> <html lang="en" ...
- ubuntu通过代理设置update源
ubuntu更换国内源 备份/etc/apt/sources.list文件 cp /etc/apt/sources.list /etc/apt/sourses.list.backup #163源deb ...