上一次c语言多文件处理代码的改进和总结

news2024/10/2 20:23:47

先看看上一次的文件:

(3条消息) 认真复习c语言1_穿花云烛展的博客-CSDN博客

对于有重复结构体定义但是并不会报错,只是难以修改而已:为了解决这个一改就要改两次的情况,这里有一个解决方案:

 

 

 

 上面的代码是可以运行的,和之前的代码的区别就是将人员表函数里面的结构体定义换成了有关这个函数声明和结构体定义的头文件,虽然这样做,这个头文件里的声明对人员表函数没有什么用,但是不会报错;

其实有时候我还是不可以区分之前的两个案例,但是这里有总结啦,可以把它记作规则就行:

//源文件:定义的文件名.c或者c++:包含相关执行功能的函数;

//头文件:定义的文件名.h:包含符号常量,宏函数(这里指的是#define),函数声明,结构声明,类型定义;

在相关函数里面要用到函数的声明或者结构类型的定义,所以要包含头文件,而在主函数里面包含了声明或定义的头文件之后,就可以使用用相关声明或定义的函数了;

最后还再来一个头文件守卫:

如果写代码不小心写了两个引用相同的头文件,就会报错了,这个有时候手抖没办法,但是在错综复杂的文件里面,如果不小心引用了两个文件都包含一个头文件的时候,在编译器预处理之后,就又会出项重复的声明或定义,如果包含的层次更多,就会很难发现错误(比如在一个文件里包含了a,b两个头文件,然后在a头文件又包含了b头文件);那么该怎么解决呢?

可让每个头文件只允许包含一次,为了实现这个功能,就要用到条件编译(暂时没有详细了解),这里只用到它的一个代码:

在每个头文件里面的开头都加上

#ifndef 自己设置的名字(只要不和其他头文件的一样就可以了)
#define 上面设置的名字
中间是头文件里的代码;
#endif

这个有什么作用呢?

首先判断下面宏定义的名字有没有在编译器连接后被重复定义,如果没有就保留这段代码,如果有就删除这段代码,这段代码指的是

​
#ifndef 自己设置的名字(只要不和其他头文件的一样就可以了)
#define 上面设置的名字
中间是头文件里的代码;
#endif

​

这一整个;

然后再来个实际的例子,将刚刚写的代码改成这样:

 

 

 会发现报错:

 所以说重复定义是不被允许的,不论是包含main函数的文件,还是其他文件;

然后按照刚刚的办法只需改动头文件:

 当然要注意,一般在#后面都不要打分号的

当然还有一个更简单的方法,就是在头文件的首部放一个

#pragma once

就可以了:

还有个事,虽然说放在首部,但是我放在其他地方都可以正常运行,哪怕放进函数里都可以,但是也有可能只是我的代码比较简单,还是放在首部养成习惯;

当然,第二个方法有些电脑是不支持的,所以两种方法最好都记住;

最后的最后:

既然青春是一场“无论做什么都觉得浪掷”的憾意,何不反过来想想,那么,也几乎等于“无论诚恳地做了什么都不必言悔”。

 

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

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

相关文章

常见的Web攻击技术

文章目录 前言HTTP 不具备必要的安全功能在客户端即可篡改请求针对 Web 应用的攻击模式 因输出值转义不完全引发的安全漏洞跨站脚本攻击XSSXSS实例 SQL 注入攻击实例 HTTP 首部注入攻击HTTP 首部注入攻击案例HTTP 响应截断攻击 因会话管理疏忽引发的安全漏洞会话劫持会话固定攻…

Java企业级开发学习笔记(2.2)利用MyBatis实现CRUD操作

该文章主要为完成实训任务,详细实现过程及结果见【http://t.csdn.cn/ajSEO】 文章目录 一、准备工作二、查询表记录2.1 在映射器配置文件里引入结果映射元素2.2 添加按姓名查询用户记录功能2.2.1 添加按姓名查询的映射语句2.2.2 添加按姓名查询用户记录的测试方法2.…

17、嵌入式Servlet容器

文章目录 1、切换嵌入式Servlet容器2、定制Servlet容器 【尚硅谷】SpringBoot2零基础入门教程-讲师:雷丰阳 笔记 路还在继续,梦还在期许 1、切换嵌入式Servlet容器 ● 默认支持的webServer ○ Tomcat, Jetty, or Undertow ○ ServletWebServerApplicati…

C++linux高并发服务器项目实践 day7

Clinux高并发服务器项目实践 day7 进程间通信匿名管道管道的特点匿名管道的使用创建匿名管道查看管道缓冲大小命令查看管道缓冲大小函数匿名管道通信案例 管道的读写特点 有名管道有名管道的使用写FIFO管道读FIFO管道总结有名管道实现简单版聊天功能 进程间通信 进程是一个独立…

SRv6实践项目(五):ONOS控制平面实现控制

在先前的几个小结中,一共了解了: p4的编译过程p4runtime的实现原理NDP协议的简单工作流程YANG模型的定义以及用处基于YANG的配置和状态的读写 一共实现了: Mininet拓扑创建p4的基本框架编写对数据平面进行订阅以实现状态读取对数据平面进行…

OJ系统刷题 第十一篇(重点题)

13463 - 折点计数(难题!重点题!) 时间限制 : 1 秒 内存限制 : 128 MB 给定 n 个整数表示一个商店连续 n 天的销售量。 如果某天之前销售量在增长,而后一天销售量减少,则称这一天为折点,反过来…

玩转车载影像传输技术 ,学习Opengl与Surface渲染提升车载影像传输效果

近年来,随着智能化汽车的快速发展,车载倒车影像逐渐成为了汽车安全辅助系统的标配,而高清传输的倒车影像则成为了目前主流的倒车影像传输方式。在这一过程中,Opengl与Surface渲染技术的应用也是不可或缺的一环。 一、高清传输倒车…

E. Archaeology(纯思维)

Problem - E - Codeforces 爱丽丝买了一个刚果总理视频的订阅,正在看一部关于苏格兰卡特林湖的因子岛的考古发现的纪录片。考古学家发现了一本书,其年代和来源都不明。也许爱丽丝可以对它进行一些解释? 这本书包含一串字符 "a"、&…

【AI绘画】Stable Diffusion的介绍及程序示例

Stable Diffusion 1.背景2.StableD 的原理3.StableD 的应用3.1.如何使用 StableD 进行图像生成3.2 图像生成与编辑3.2.1 生成新图像3.2.2 图像编辑 1.背景 近年来,随着人工智能技术的发展,图像生成和合成技术得到了很大的发展。Stable Diffusion (Stable…

MyBatis的关联映射和缓存机制

学习目标: 了解数据表之间的三种关联关系了解对象之间的三种关系熟悉关联关系中的嵌套查询和嵌套结果掌握一对一关联映射掌握—对多关联映射掌握多对多关联映射熟悉Mybatis的缓存机制 文章概述: 前面几章介绍了MyBatis的基本用法、关联映射和动态SQL等…

CompletableFuture异步编排

CompletableFuture异步编排 1、CompletableFuture异步编排1.1 为什么需要异步编排1.2 CompletableFuture介绍1.3 创建异步对象1.4 线程串行化与并行化方法1.5 多任务组合1.6 优化商品详情页(业务代码)1.6.1 未优化之前的代码1.6.2 使用CompletableFuture异步编排1.6.3 测试功能…

Linux 下 REST 客户端的新选择:Insomnia 3.0

正在为 Linux 桌面端找一个免费的 REST 客户端? 别睡不着觉了!试试 Insomnia。 这个应用是跨平台的,可以工作在 Linux、macOS、Windows。开发者 Gregory Schier 告诉我们他创造这个应用是为了“帮助开发者处理和 REST API 的通信”。他还说&a…

如何在Java中创建临时文件?

在Java程序中,有时需要创建临时文件来暂存数据或者执行某些操作。Java提供了许多方式来创建临时文件。在本教程中,我们将介绍如何使用Java标准库来创建临时文件。 一、使用File.createTempFile()方法 Java标准库中的File类提供了createTempFile()方法来…

设计模式--单例模式

介绍 所谓类的单例模式 就是采取一定的方法保证在整个软件系统中对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法) 比如 Hibemate的SessionFactory 它充当数据存储源的代理 并负责创建Session对象 SessionFactory并不是轻量级的 一般情况下 一个…

Java中的Map(三种双列集合万字详解)

点击可查看单列集合Set万字详解:其中还包含哈希解读和底层分析。 文章目录 前言一、Map1.Map集合常用的API代码演示:1.Map集合的基本功能2.Map集合的获取功能3.Map的getOrDefault()方法 2.Map集合的三种遍历1.键找值、值找键2.键值对3.Lambda表达式 二、…

【C++11】晦涩难懂语法系列:可变参数模板

目录 可变参数模板 1.1 概念 1.2 可变参数模板定义 1.3 参数包的展开方式 1.3.1 递归展开参数包 1.3.2 逗号表达式展开参数包 1.4 STL的emplace系列函数 可变参数模板 1.1 概念 在C语言阶段,我们已经接触过可变参数,比如scand、printf等等 这里…

9.2 回归分析

学习目标: 回归分析是一种广泛应用于数据分析和预测的统计方法,可以用来探索自变量与因变量之间的关系并进行预测。我学习回归分析,我会采取以下步骤: 学习基本概念:回归分析中的基本概念包括自变量和因变量、回归系数…

运放专题:运放输入端交直流混合信号隔直放大

运放输入不隔直放大 运放输入端不隔直,那么经过运放放大后,交流成分放大了,直流成分也被放大了。看下面的仿真: 交流信号为:振幅3V, 频率5K的正弦波,直流偏置为1V 可以看到,交流信号被放大的…

【Linux】匿名管道代码实现-mypipe

文章目录 管道介绍什么是管道:管道的原理管道的特点 具体代码详写创建初始文件makefile编写定义任务列表-task.hpp分阶段代码编写总代码展示: ctrlProcess.cc 编写头文件包含(如有不会,自己查谷歌)定义全局变量以解耦main,函数框架EndPoint定义creatProcess 创建管道…

Apollo配置中心使用篇

Apollo配置中心使用篇 常见配置中心对比Apollo核心概念Apollo核心特性Apollo架构设计各模块介绍服务端设计客户端设计Apollo与Spring集成的底层原理 Apollo安装安装apollo-portalconfig service和admin service部署多网卡问题解决修改Portal环境配置调整ApolloPortal配置 Apoll…