关于变量的声明和定义、内部函数和外部函数

news/2024/11/14 17:59:35/文章来源:https://www.cnblogs.com/EricsT/p/18546512

关于变量的声明和定义

一个函数一般由两部分组成:声明部分和执行语句。声明部分的作用:是对有关的标识符(如变量、函数、结构体、共用体等)的属性进行声明。对于函数而言,声明和定义的区别是明显的,函数的声明是函数的原型,而函数的定义是对函数功能的定义。对被调用函数的声明是放在主调函数的声明部分中的,而函数的定义显然不在声明部分的范围内的,它是一个独立的模块

对变量而言,声明与定义的关系稍微复杂一些。在声明部分出现的变量有两种情况:

  • 需要建立存储空间的,此为定义性声明,简称定义
  • 不需要建立存储空间的,此为引用性声明

广义的说,声明包括定义,但并非所有的声明都是定义。例如 int a;,既是声明,也是定义;而对extern a;而言,是声明而不是定义。一般为了叙述方便,把建立存储空间的声明称定义,而把不需要建立存储空间的声明称为声明。显然这里指的声明是狭义的,即非定义性声明。

外部变量定义和外部变量声明的含义是不同的。外部变量的定义只能有一次,它的位置在所有函数之外。在同一文件中,可以有多次对同一外部变量的声明,它的位置可以在函数内(哪个函数要用就在哪个函数中声明),也可以在函数之外(在外部变量的定义点之前)。系统根据外部变量的定义(而不是根据外部变量的声明)分配存储单元。对外部变量的初始化只能在“定义”时进行,而不能在“声明”中进行。所谓“声明”,其作用是声明该变量是一个已在其他地方已定义的外部变量,仅仅是为了扩展改变量的作用范围而作的“声明”

在函数中出现对变量的声明(除了用 extern 声明的以外)都是定义。在函数中对其他函数的声明不是函数的定义

内部函数和外部函数

函数本质上是全局的,因为定义一个函数的目的就是要被另外的函数调用。如果不加声明的话,一个文件中的函数既可以被文件中的其他函数调用,也可以被其他文件中的函数调用。但是,也可以指定某些函数不能被其他文件调用。根据函数能否被其他源文件调用,将函数区分为内部函数和外部函数

内部函数

如果一个函数只能被本文件中的其他函数所调用,它称为内部函数

在定义内部函数时,在函数名和函数类型的前面加static ,即:

static 类型名 函数名(形参表);

内部函数又称为静态函数,因为它是用 static 声明的。

使用内部函数,可以使函数的作用域只局限于所在文件。这样子,在不同的文件中即使有同名的内部函数,也互不干扰。这就使它对外界“屏蔽”了

通常,一个大程序往往分工由不同的人分别编写不同的文件模块,在各人编写自己的文件模块时,不必担心所用函数是否会与其他文件模块中的函数同名

通常把只能由本文件使用的函数和外部变量放在文件开头,前面都冠以 static 使之局部化,其他文件不能引用。这就提高了程序的可靠性。

外部函数

如果在定义函数时,在函数的首部的最左端加关键字 extern ,则此函数是外部函数,可供其他文件调用

extern 函数类型 函数名(形参列表)

C语言规定,如果在定义函数时省略 extern ,则默认为外部函数

在需要调用此函数的其他文件中,需要对此函数作声明(不要忘记,即使在本文件中调用一个函数,也要用函数原型进行声明)。在对此函数作声明时,要加关键字 extern ,表示该函数“是在其他文件中定义的外部函数”

使用 extern 声明就能够在本文件中调用在其他文件中定义的函数,或者说把该函数的作用域扩展到本文件中

extern 声明的形式就是在函数原型基础上加关键字 extern

由于函数本质上是外部的,在程序中经常要调用其他文件中的外部函数,为方便编程,C语言允许在声明函数时省写 extern

用函数原型能够把函数的作用域扩展到定义该函数的文件之外(不必使用 extern)。只要在使用该函数的每一个文件中包含该函数的函数原型即可。函数原型通知编译系统:该函数在本文件中稍后定义,或在另一文件中定义。

利用函数原型扩展函数作用域最常见的例子是 #include指令的应用。在#include指令所指定的“头文件”中包含调用库函数所需的信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/833521.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5.7 与 8.0 对相同文件的 LOAD DATA 语句结果不同

5.7 与 8.0 对相同文件的 LOAD DATA 语句结果不同 问题描述 某客户现场支持,由MySQL 5.7.21升级MySQL 8.0.25后,通过LOAD DATA导入文件,当同一会话连续导入不同的编码(UTF8/GB18030)文件时会出现乱码。数据库版本未升级之前,相同的导入操作在MySQL 5.7.21未出现乱码。 问…

用命令行启动 docker 报错:Redirecting to /bin/systemctl start docker.service 解决方法

docker安装成功后,用 sudo service docker start 启动docker报这个错误,看提示应该是需要用systemctl的命令。 使用systemctl start docker命令启动成功了,做下记录。 以下是启动doker常用的几个命令: # 启动 docker:systemctl start docker # 停止 docker:systemctl sto…

CCF - 网易雷火基金项目成果:基于大小模型协同的低资源标注技术|CNCC 2024 演讲实录

在科技蓬勃发展的时代浪潮中,人工智能领域的每一次突破都离不开持续的科研投入和对前沿技术的不懈探索。2023 年,网易伏羲与中国计算机学会(CCF)共同发起了 “CCF - 网易雷火联合基金”,致力于发挥和利用多方资源优势,加强与海内外青年学者的科研合作,促进中国人工智能等…

VisualVM 使用说明

VisualVM 简介:一个轻量级的Java进程监控软件 VisualVM 安装介绍(Mac 使用 brew 安装) ➜ ~ brew uninstall visualvm==> Uninstalling Cask visualvm ==> Backing App VisualVM.app up to /opt/homebrew/Caskroom/visualvm/2.1.10/VisualVM.app ==> Removing App /…

Java方法(四)

设计方法原则:本意为功能块,是实现某个功能语句块的结合,设计方法时保持原子性(一个方法完成一个功能)public class operator {public static void main(String[] args) {int sum = add(1,3);System.out.println(sum);}//加法public static int add(int a,int b){return a…

11.14,python之自动化

python+selenium selenium是一个第三方库,python有很多库; 1、什么是ui自动化? 通过模拟手工操作用户ui页面的方式,用代码去实现自动化操作和验证的行为。 2、ui自动化的优点? (1)解决重复性的功能测试和验证 (2)减少测试人员在回归测试时用例漏测和验证点的漏测 (3)…

快来验 踩CTH !!!

题目 别样的,验个数据验成这使样还怎么玩? 谁跟谁的都不一样

python自动化之selenium

python+selenium selenium是一个第三方库,python有很多库; 1、什么是ui自动化? 通过模拟手工操作用户ui页面的方式,用代码去实现自动化操作和验证的行为。 2、ui自动化的优点? (1)解决重复性的功能测试和验证 (2)减少测试人员在回归测试时用例漏测和验证点的漏测 (3)…

高级语言程序设计第七次个人作业

班级链接:https://edu.cnblogs.com/campus/fzu 作业要求链接:https://edu.cnblogs.com/campus/fzu/2024C/homework/13304 学号:102400130 姓名:杨子旭

GDPC-CSACTF Round2 WP Web篇

先从简单的开始 ezupload题目都把解题方法拍脸上了,随便上网找一个php一句话木马上传后拿webshell软件(我用的是蚁剑antsword)脸上就可以翻服务器了,最后在usr找到flag,比较搞笑的是我第一次出了点问题还以为要提权,经典把题目做难ezcmd 同样是几乎送分题,跟一轮一样直接…

不推荐别的了,IDEA 自带的数据库工具就很牛逼!

https://blog.51cto.com/u_13626762/5225591 导出数据库表模型 https://github.com/godmaybelieve

cmu15545笔记-排序和聚合算法(SortingAggregation Algorithms)

目录概述排序堆排序外部归并排序使用索引聚合操作排序聚合哈希聚合 概述本节和下一节讨论具体的操作算子,包括排序,聚合,Join等。 排序 为什么需要排序操作: 关系型数据库是无序的,但是使用时往往需要顺序数据(Ordered By,G roup By,Distinct)。 主要矛盾:磁盘很大:…