【C语言编程入门笔记】C语言果然博大精深!函数还分内部和外部?

文章图片
外部函数与内部函数
前面我们讲解了关于函数的调用都是针对同一个源文件中其他函数进行调用的 , 而在有些情况下 , 函数也可以对另外一个源文件中的函数进行调用 。 当一个程序由多个源文件组成时 , 根据函数是否能被其他源文件调用 , 可以将函数分为内部函数和外部函数两种类型 。

文章图片
出于大家可能不了解 , 我就画了一个程序运行的简图 。 大家可能会很奇怪 , 怎么会有多个源文件 , 一般我们都是只创建一个源文件 , 然后在里面写代码的 。 事实上我们可以创建多个源文件 , 用来把各个功能模块区分 , 所以我们是可以在一个源文件中调用另一个源文件中的函数的 。
外部函数
什么是外部函数呢?当我们在开发大型项目时 , 为了便于团队的协同工作 , 往往需要把一个项目拆分成很多源文件来分别实现 , 最终再把它们整合在一起 。 为了减少重复代码 , 一个源文件有时需要调用其他源文件中定义的函数 。 所以 , 在C语言中 , 可以被其他源文件调用的函数称为外部函数 。
另外在调用外部函数之前 , 需要在当前源文件中定义外部函数 。 定义外部函数的方式是在函数的返回值类型前面添加extern关键字 , 示例代码如下:
在这个示例代码中 , 编译器会通过extern关键字知道add()函数是定义在其他文件中的外部函数 。
为了让大家能够掌握外部函数的用法 , 接下来 , 在first.c文件中定义一个add()函数 , 然后在second.c文件中使用first.c文件中定义的add()函数 。
first.c
second.c

文章图片
运行结果如图所示:
在second.c文件中 , second.c文件通过调用first.c中定义的add()函数计算出1加2的结果 。 second.c文件中的外部函数add()是在first.c文件中实现的 , 编译器从first.c中找到了该函数 , 并将它的作用域扩大到second.c文件中 , 于是second.c文件中也可以调用这个first.c中定义的add()函数 , 从而完成计算 。
为简化编程 , C语言中允许在定义外部函数时省略extern关键字 。 first.c中定义的外部函数add()也可以修改为下面的代码:
上述代码由函数的返回类型、函数名和参数列表组成 , 这类格式的代码被称为函数原型 。 当代码中包含函数原型时 , 可能会有下列两种情况:
1、程序员希望编译器自动从其他文件中查找该函数的定义 。
2、程序员先定义未实现的空函数 , 然后在其他文件中具体实现 。
接下来就来看一下printf()函数的原型写法 , 具体代码如下:
当在main()函数中定义了printf()函数的原型后再调用时就可以不用包含头文件 。

文章图片
运行结果如图所示:
在这个例题中 , 我们的程序并没有包含头文件stdio.h , 但是在代码第1行中声明了printf()函数的原型 , 那么编译器将会根据该原型自动从其他文件中查找该函数的定义 , 并将该函数的作用域扩展到原型所在的文件中 , 因此在本文件中就可以调用printf()函数 。
需要注意的是 , 在声明外部函数时 , 无论有或没有关键字extern , 外部函数与原函数定义的返回值类型、函数名称和参数列表必须一致 。
内部函数
从上面讲解的外部函数可知 , 只要声明一个函数原型就能够调用其他源文件中的函数 。 但是当多人参与开发一个项目时 , 很有可能会出现函数重名的情况 , 这样 , 不同源文件中重名的函数就会互相干扰 。 此时 , 就需要一些特殊函数 , 这些函数只在它的定义文件中有效 , 该类函数称为内部函数 。
在定义内部函数时 , 需要在函数的返回值类型前面添加static关键字(又称为静态函数) , 示例代码如下:
为了让大家熟悉内部函数的作用 , 接下来通过在两个源文件中定义同名的内部函数来演示内部函数的用法 。
first.c

文章图片
second.c

文章图片
运行结果如图所示:
在first.c和second.c中 , 我们都定义了一个函数show() , second.c文件中的函数是内部函数 。 从运行结果可以看出 , first.c中的show()函数被调用成功了 , 因此说明内部函数只会被自身调用 , 不会受到其他文件中同名函数的影响 。 从运行结果中可以看出 , second.c中的show()函数被调用了 。
M脚下留心:
如果将second.c中修饰show()函数的关键字static去除 , 运行时程序会提示错误 , 如下图所示:

文章图片
从这张图的错误结果可以看出 , 如果outer.c中的show()函数不声明为内部函数 , 就会受到其他文件中的同名函数的干扰 。
学计算机编程不易 , 此路应携手前行 。

文章图片
【来源:魏博镇】
【【C语言编程入门笔记】C语言果然博大精深!函数还分内部和外部?】声明:转载此文是出于传递更多信息之目的 。 若有来源标注错误或侵犯了您的合法权益 , 请作者持权属证明与本网联系 , 我们将及时更正、删除 , 谢谢 。 邮箱地址:newmedia@xxcb.cn
推荐阅读
- 王者荣耀:耀神单排王者低星局,天秀公孙离距离失败仅差一毫米!
- 数字人民币试点地区展开测试 集中在餐饮、零售、充值等小范围场景
- the|新冠肺炎成美国第三大致死原因 仅次于心脏病和癌症
- IG能否站稳脚跟?LPL的5局4胜制,让人怀疑世界赛是否还有机会
- 梦幻西游:炼妖达人的真实力,合宠连出极品,血赚美滋滋!
- 提供“让兴趣成为职业”的可能 “微经济”有大宝藏
- 再忆两岸战疫共情故事 台湾青年:相信自己是那打败黑暗的一道光
- 北京发布“26条措施”实施指南 优化台胞台企发展环境
- 看上去相当的独立,实际上爱情里是个粘人鬼的三大星座
- 看观汽车|原装进口发动机,入门7万出头,看着动感坐着舒适,丰田致享如何
