C中的函数原型声明、头文件包含的思考

1)如果add1.c调用了add2.c中的add2函数,add2.h定义了add2.c中的函数原型,add1.c需包含#include "add2.h"的原因?

add1.c既然调用了函数add2,必须知道函数add2的函数原型,否则gcc -c add1.c,编译时只能使用implicit-function-declaration(隐式函数定义),对于调用者来说,当然有可能调用错(不知道函数参数、返回值)

2)add2.c需包含#include "add2.h"的原因?

add2.h向外界提供了add2.c中的函数接口,在add2.c中包含add2.h,可以有效避免add2.c向外界暴露的接口与add1.c中的调用的函数定义不同

3)add56.c中同时定义了add5、add6,同时add5函数调用了add6函数,如果不包含#include "add56.h",则add6函数定义需要写在add5函数前面,如果包含了#include "add56.h",就不需要考虑这些问题了

4)add2.c可以编译为库,供调用者使用,add2.c可以理解工具库、linux系统常用库的前身,add2.h可以理解为包含接口定义的头文件

5)提前给出函数声明表明当前文件中可能没有函数的实现,但预期在其他地方有实现。这样做允许源文件、库文件之前的相互依赖和调用,提高代码的模块性和重用性。

6)如果在链接时没有找到函数的定义,链接器会报未解析的外部符号之类的错误;如果有多个相同的函数定义,通过会报重复的符号的错误。这些错误都指出了程序结构上的问题,需要程序员解决。

7)在现代编程实践中,头文件通常用于包含函数声明,以及类型定义和宏定义等。通过在多个源文件中包含相同的头文件,可以确保函数声明一致性,避免因声明不一致导致的编译错误。

总之,在调用函数之前需要先有一份函数定义。

以下是AIGC工具给出的回答:

1)避免接口不一致的问题:如果add2.c中的函数定义与头文件中的声明不一致,例如参数个数、类型或者返回类型不同,编译器会报告函数原型不匹配的错误。通过包含头文件,可以确保函数的声明和定义保持一致,避免了这类问题的发生。

2)可维护性:当需要修改函数接口时,只需修改头文件中的函数声明,而不需要修改所有调用改函数的地方。这种做法使得代码更易于维护,同时也减少了因接口变更而导致的错误。

笔者注:其实笔者对这个观点有疑问,函数接口修改之后,所有调用函数的地方也需要修改吧,这里姑且理解为使用#include "add2.h"与直接在add1.c中进行被调用函数声明的优缺点讨论,前者相比于后者的优点是在函数接口发生后,需要改的地方更少

3)模块化设计:头文件的存在使得代码模块化,函数的接口与实现分离,有助于代码的组织和管理

笔者注:函数的接口与实现分离,可以提供更好的可复用性

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

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

相关文章

联想电脑VMware虚拟机VT开启虚拟化

以联想电脑为例。 关机重启, 有的电脑是按F2, 有的是按fnF2 进入BIOS,左右键,选择Configuration, 再上下键选择 Intel Virtual Technology 按回车键,再按上下键选择 Enable ,回车确认。 按fn…

Xlinx相关原语讲解导航页面

原语就是对FPGA底层器件的直接调用,与IP功能是类似的,将原语的参数变成IP配置时的GUI界面参数,可能会更加直观。IP的缺陷在于繁杂,比如SelectIO IP内部包含IDDR、ODDR等等IO转换的功能,如果只想使用单沿转双沿一个功能…

ChatGPT全方位解析:如何培养 AI 智能对话技能?

简介 ChatGPT 的主要优点之一是它能够理解和响应自然语言输入。在日常生活中,沟通本来就是很重要的一门课程,沟通的过程中表达的越清晰,给到的信息越多,那么沟通就越顺畅。 和 ChatGPT 沟通也是同样的道理,如果想要C…

[软件使用-Vcftools / Plink ] VCF文件中剔除/提取一个或多个样本,两组方法实现及运算时间比较

官网:VCFtools 参数查看: 提取样本 --keep 剔除样本 --remove # 提取某几个样本 system("vcftools --vcf eg.vcf --keep keep.list --recode --out keep") # keep.list 是由每一行为一个样本ID组成的文件 tips: 运行比较耗时 官网&#xff…

Spring的Bean标签配置IOC和依赖注入详解

目录 spring配置文件详解 spring配置文件详解 spring的依赖注入和控制反转梳理总结,仅供参考 /*** Bean的依赖注入:* ① 创建 UserService,UserService 内部在调用 UserDao的save() 方法* ② 将 UserServiceImpl 的创建权交给 Spring* ③ 从…

Oracle测试10046参数及打印结果

1.1 开启session sql trace alter session set tracefile_identifier10046; alter session set timed_statistics true; --默认是true alter session set statistics_levelall; --实例级别设置需要注意,会消耗大量的CPU alter session set max_…

《关于进一步优化重点文旅场所支付服务 提升支付便利性的通知》发布

为贯彻党中央、国务院决策部署,落实《国务院办公厅关于进一步优化支付服务 提升支付便利性的意见》要求,近日,中国人民银行、文化和旅游部、国家外汇管理局和国家文物局联合印发《关于进一步优化重点文旅场所支付服务 提升支付便利性的通知》…

【算法】二分算法题

个人主页 : zxctscl 如有转载请先通知 题目 1. 704. 二分查找1.1 分析1.2 代码 2. 34. 在排序数组中查找元素的第一个和最后一个位置2.1 分析2.2 代码 3. 35. 搜索插入位置3.1 分析3.2 代码 4. 852. 山脉数组的峰顶索引4.1 分析4.2 代码 5. 153. 寻找旋转排序数组中…

程序员面试经典——01.01. 判定字符是否唯一

01.01. 判定字符是否唯一 已解答 简单 实现一个算法&#xff0c;确定一个字符串 s 的所有字符是否全都不同。 示例 1&#xff1a; 输入: s "leetcode" 输出: false 示例 2&#xff1a; 输入: s "abc" 输出: true限制&#xff1a; 0 < len(s) &…

蓝桥杯简单STL

目录 vector vector定义 vector访问 常用函数 size() ​编辑 push_back(num) pop_back() clear 迭代器&#xff08;iterator) 迭代器定义 遍历数组示例 insert(it, element) erase(it) 标准模板库--STL&#xff0c;它包含了多种预定义的容器、算法和迭代器&…

联想电脑开启虚拟化失败,开启虚拟化却提示还没有开启虚拟化

安装虚拟机的时候&#xff0c; 电脑要开启虚拟化&#xff0c; Intel VT&#xff0c; 去BIOS开启了&#xff0c; 但是依然报错&#xff0c;说虚拟化处于禁用状态。 解决方案&#xff1a; 去联想官方&#xff0c;下载BIOS更新包&#xff0c;更新BIOS。 更新文档&#xff1a; 联…

Harmony鸿蒙南向驱动开发-DAC

DAC&#xff08;Digital to Analog Converter&#xff09;是一种通过电流、电压或电荷的形式将数字信号转换为模拟信号的设备。 DAC模块支持数模转换的开发。它主要用于&#xff1a; 作为过程控制计算机系统的输出通道&#xff0c;与执行器相连&#xff0c;实现对生产过程的自…

MySQL数据库 数据库基本操作(四):表的增删查改(下)

1. 联合查询 注:联合查询是面试中的重点,只要考到sql,大多数情况下都考的是联合查询,而且联合查询也是我们学习中的难点. 1.1 笛卡尔积 在实际开发中,数据往往来自不同的表,所以要多表联合查询.多表查询是对多张表的数据笛卡尔积. 它们是两张表的各行数据通过全排列得到的. …

基于SSM+Jsp+Mysql的高校毕业设计管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

秋招复习笔记——八股文部分:操作系统

笔试得刷算法题&#xff0c;那面试就离不开八股文&#xff0c;所以特地对着小林coding的图解八股文系列记一下笔记。 这一篇笔记是图解系统的内容。 硬件结构 CPU执行程序 计算机基本结构为 5 个部分&#xff0c;分别是运算器、控制器、存储器、输入设备、输出设备&#xf…

轻量的 WebHook 工具:歪脖虎克

本篇文章聊聊轻量的网络钩子&#xff08;WebHook&#xff09;工具&#xff1a;歪脖虎克。 写在前面 这是一篇迟到很久的文章&#xff0c;在 21 年和 22 年的时候&#xff0c;我分享过两篇关于轻量的计划任务工具 Cronicle 的文章&#xff1a;《轻量的定时任务工具 Cronicle&a…

运筹学基础(六)列生成算法(Column generation)

文章目录 前言从Cutting stock problem说起常规建模Column generation reformulation 列生成法核心思想相关概念Master Problem (MP)Linear Master Problem (LMP)Restricted Linear Master Problem (RLMP)subproblem&#xff08;核能预警&#xff0c;非常重要&#xff09; 算法…

智能编程助手CodeGeeX使用评测

CodeGeeX是一款基于大模型的智能编程助手&#xff0c;它可以实现代码的生成与补全&#xff0c;自动为代码添加注释&#xff0c;不同编程语言的代码间实现互译以及针对技术和代码问题的智能问答功能。帮助开发者显著提高工作效率&#xff0c;CodeGeeX支特1OO种编程语言&#xff…

kvm基础命令

前言 一、基础命令 1.虚拟机查看 2.虚拟机开启与关闭 3.虚拟机删除 4.查看虚拟机的配置 5.配置文件重定向 6.命令行登录虚拟机 二、调整虚拟机磁盘大小 三、虚拟机创建快照 四、virsh console报错 总结 前言 今天我们分享一下如何使用kvm基础命令。 一、基础命令 1.虚拟机查看…

杨笛一新作:社恐有救了,AI大模型一对一陪聊,帮i人变成e人

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站ai人工智能工具 更多资源欢迎关注 在社交活动中&#xff0c;大语言模型既可以是你的合作伙伴&#xff08;partner&#xff09;&#xff0…