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中 ...
随机推荐
- WebMagic使用代理ip爬数据解决HTTP407问题
手头一个小活儿是爬竞品网站数据.使用webmagic来实现.光公司ip不行,被封了就会影响业务正常访问.刚好公司另一个项目购买了代理IP资源“站大爷”,那个项目夭折了,于是申请借来用用. 调通站大爷提 ...
- 记录C#连接数据库工具类
一.SQL Server /// <summary> /// 数据库的通用访问代码 /// 此类为抽象类, /// 不允许实例化,在应用时直接调用即可 /// </summary&g ...
- Python添加邮件附件并通过邮件发送测试报告
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText c ...
- Windows 10 任务栏添加网易云音乐控制按钮
软件背景: 算是老帖新发,之前有朋友分享过一个很好用的工具,但可能是因为网易云软件更新后,导致控件失灵了,只剩下歌词控件有用了,所以今天用python重新写了一个小工具,发出来分享给大家,附上之前 ...
- Deepin 15.9系统直接运行exe运行程序
以下为你介绍在深度Deepin 15.9 Linux操作系统下直接运行exe文件的方法,此方法基于deepin-wine实现,经测试,一些exe文件是可以正常打开的,但部分可能会出现无法使用的情况,但 ...
- 2019 SDN上机第7次作业
2019 SDN上机第7 次作业 basic补充`/* -- P4_16 -- */ include <core.p4> include <v1model.p4> const ...
- 小程序-小菊花loading
界面----交互 wx.showLoading() 显示loading提示框.需主动调用wx.hideLoading()才能关闭提示框 参数: 属性 类型 默认值 必填 说明 title string ...
- [题解向] PAM简单习题
\(1\) LG5496 [模板]回文自动机 对于 \(s\) 的每个位置,请求出以该位置结尾的回文子串个数. \(|s|\leq 1e6\) 然后就是PAM的板子题咋感觉好像没有不是很板的PAM题呢 ...
- 趣谈Linux操作系统学习笔记:第二十九讲
一.引子 在这之前,有一点你需要注意.解析系统调用是了解内核架构最有力力的一把钥匙,这里我们只要重点关注这几个最重要的系统调用就可以了 1.mount 系统调用用于挂载文件系统:2.open 系统调用 ...
- java之三元运算符
逻辑运算 ? m : n;如果逻辑运算为真,则返回m,否则返回n 实例: 判断i,j两个数的大小,如果a较大,则输出1,否则输出0: 找到i,j,k三个数中的最大值: public class Tes ...