【C++基础】函数的分文件编写

cpp函数的分文件编写

作用:让代码结构更加清晰

如下步骤:

  1. 创建后缀名为.h的头文件
  2. 创建后缀名为.cpp的源文件
  3. 在头文件中写函数的声明
  4. 在源文件中写函数的定义,同时引入自定义头文件,将头文件与源文件绑定
  5. 在使用函数的地方,使用 ""调用.h头文件,在使用的地方直接使用函数

原本的实现方式,函数的 声明实现使用都写在一个test.cpp文件中

test.cpp:

#include
using namespace std;

// 函数的分文件编写
// 实现两个数字进行交换的函数

// 函数的声明
void swap(int a, int b);

// 函数的定义
void swap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;

    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

}

int main() {
    int a = 10;
    int b = 20;
    swap(a, b);

    system("pause");
    return 0;
}

当代码量变大的时候,这会让整个代码的结构不够清晰

解决办法:通常将一些 函数的实现函数的声明分开到一些文件中,单独地去使用

  1. 创建swap.h文件
  2. 创建swap.cpp文件

将刚才test文件中swap函数的声明放入swap.h,swap函数的实现过程放入swap.cpp

swap.h:

#pragma once
void swap(int a, int b);

swap.cpp

void swap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;

    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
}

此时需要将swap.h和swap.cpp文件 关联起来:在函数具体实现的地方引入自定义头文件,让自定义头文件不仅有函数的声明而且还能找到具体的函数实现

#include "swap.h"  // 将函数实现cpp文件与自定义头文件关联起来

void swap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;

    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

}

上面的操作就会让函数的实现与自定义头文件绑在一起,以后要使用这个函数的时候,只需要引入这个自定义头文件

此时编译器会报错,提示:

【C++基础】函数的分文件编写

因为 cout是包含在另外一个头文件中的,可以在这个cpp文件中直接引入这个头文件,也可以在swap.h中将这个头文件引入

swap.h:

#pragma once
#include
using namespace std;

void swap(int a, int b);

此时cpp中不会再有报错

经过上面的操作后,要在test.cpp中使用函数的话,不再像最开始那样一堆代码在一块,可以变得很简洁。

test.cpp:

#include
#include "swap.h"
using namespace std;

int main() {
    int a = 10;
    int b = 20;
    swap(a, b);

    system("pause");
    return 0;
}

此时swap函数可以在test.cpp文件中使用

总结:

将函数的声明以及函数可能使用的一些头文件,写入一个自定义头文件,引入自定义头文件时,需要使用 ""

写好头文件后,再单独写一个函数的实现cpp,在这个cpp中,头文件只需要引入自定义头文件即可。

此时这个头文件就与这个函数实现cpp绑定在了一起,这个头文件不光有函数的声明,还可以找到这个函数的具体实现

当头文件、函数具体实现cpp都写好了后,我们在别的地方想调用这个函数的时候,只需要引入自定义头文件即可,然后直接调用函数,无需将函数实现,因为编译器可以通过这个自定义头文件自动找到调用的函数的具体实现。

所有的文件最终实现如下:

swap.h:

#pragma once
#include
using namespace std;

void swap(int a, int b);

swap.cpp:

#include "swap.h"

void swap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;

    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

}

test.cpp:

#include
#include "swap.h"
using namespace std;

int main() {
    int a = 10;
    int b = 20;
    swap(a, b);

    system("pause");
    return 0;
}

简而言之,自定义头文件起到 串联的作用,在自定义头文件中是函数的声明以及一些函数的实现必要的头文件。具体函数的实现的位置会将自定义头文件引入,这样自定义头文件就可以找到这个具体的函数实现,以后要使用的时候,不需要再把函数的实现写一遍,引入自定义头文件,就等同于引入了这个函数的实现,可以直接使用这个函数。

Original: https://www.cnblogs.com/seansheep/p/15919535.html
Author: 在青青草原上抓羊
Title: 【C++基础】函数的分文件编写

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/608957/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 你的团队工作量饱和吗?

    参与软件开发的相关人员,虽然称为工程技术人员,但本质上其实就是手艺人。手艺嘛肯定是一技之长,里面多少有些门道,外行人做不了, 也很难完全搞清楚其中的门道,合作过程中就怕被坑上当 :…

    Linux 2023年6月13日
    096
  • 假如,程序员面试的时候说真话

    做程序员这么长时间了,经常能够听到一句话:面试造火箭,入职拧螺丝。而且,随着就业环境越来越卷,现在只会造火箭恐怕都不行了,得能造个空间站才行。 回想自己刚毕业那会儿,哪有什么八股文…

    Linux 2023年6月7日
    085
  • Windows server 2008 域控制器

    Windows的网络架构 Windows的网络架构大致分为: 工作组架构 域架构 工作组架构:工作组是由一组通过网络连接在一起的计算机组成,组内的计算机可以共享本机的文件,打印机等…

    Linux 2023年6月7日
    0104
  • Android:hook很“危险”,使用需谨慎。

    前言 上篇文章《Android安卓进阶技术分享之AGP工作原理》和大家分析了 AGP(Android Gradle Plugin) 做了哪些事,了解到 AGP 就是为打包这个过程服…

    Linux 2023年6月13日
    084
  • SQLI-LABS(Less-9、10)

    Less-9(GET-Blind-Time based-Single Quotes) 打开 Less-9页面,可以看到页面中间有一句 Please input the ID as …

    Linux 2023年6月6日
    0106
  • Redis-Sentinel Redis的哨兵模式

    Redis-Sentinel Redis的哨兵模式Redis Sentinel 模式简介Redis-Sentinel是官方推荐的高可用解决方案,当redis在做master-sla…

    Linux 2023年5月28日
    0100
  • acl/客户端缓存/多级缓存

    redis6安装注意点 我们课程里忽略了,就不去安装了,仅仅只提供安装文档,redis6的安装其实和redis5安装差不多,只是需要注意gcc的版本需要提高,不然编译会出错。参考慕…

    Linux 2023年5月28日
    0101
  • Unity Profiler的使用

    选中Development Build、Autoconnect Profiler和Script Debugging三个选项,如下图所示。 点击Build And Run按钮,将会编…

    Linux 2023年6月7日
    0101
  • redis的GEO实战 (RedisTemplate)

    geoadd 时间复杂度为O(log(N)) geoadd cityGeo 116.405285 39.904989 “北京”geoadd cityGeo …

    Linux 2023年5月28日
    0102
  • wordpress固定链接+宝塔nginx配置伪静态访问URL

    一、站点设置 打开站点设置,选择伪静态,选择wordpress 二、wordpress设置 打开wordpress后台,选择 设置 —》固定链接 选择一个你喜欢的格式点…

    Linux 2023年6月14日
    0110
  • VMware ESXi 7.0 U3 SLIC 2.6 & Unlocker

    提供标准版和 Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科) 定制版镜像 请访问原文链接:VMware ESXi 7.0…

    Linux 2023年5月27日
    090
  • [转]EVE-NG 中使用 SecureCRT 合并tab标签

    在EVE-NG中双击设备使用SecureCRT对设备进行调试连接时,会出现每次连接不同设备时都会打开一个新的SecureCRT窗口,而不是在一个窗口中添加一个新的标签页,这就会导致…

    Linux 2023年6月8日
    0105
  • Centos7最小化安装报错There are no enabled repos. Run “yum repolist all” to see the repos you have.解决办法

    原因是缺少CentOS-Base.repo文件,因为我这台机器wget也不能用,所以我是下载到本地sftp上去的,传输的时候一定要在root用户下,否则会无法启动传输 这是报错的完…

    Linux 2023年6月7日
    0114
  • 中土批量运维神器《ps1屠龙刀》 pk 西域批量运维圣器《ansible圣火令》

    据故老相传,运维界有句话:”脚林至尊,宝刀【ps1屠龙】,号令被控,莫敢不从”。 https://gitee.com/chuanjiao10/kasini3…

    Linux 2023年6月14日
    0126
  • Java高级

    抽象类和抽象方法 1.定义 随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。 类的设计应该保证父类和子类都能够共享特征。 有时候将一个父类设计的非常抽象…

    Linux 2023年6月13日
    0115
  • Python中使用 for 循环来拿遍历 List 的值

    常规版本 简单的 for 循环遍历 x_n = ["x1","x2","x3"] for x in x_n: print…

    Linux 2023年6月7日
    094
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球