关于将函数写入头文件问题(分离式编译)

2023-05-16

如果某些函数在其他很多 cpp 文件中被调用,那么为了避免写大量重复的代码以及让代码量更小一些,我们可以将这些函数写头文件中,然后其他 cpp 文件只需要引用该头文件然后就可以使用包含在头文件中的函数了。

具体实现方法:

可以直接将函数的定义写入一个xxx.h文件中
然后用g++ xxx.h 命令将xxx.h编译一遍
然后在cpp源文件中用#include"xxx.h"引用即可

然而上面的方法是存在问题的,如果直接将函数的定义写入头文件中,那么这个头文件如果只同时被一个 cpp 文件引用是可行的,但如果其同时被多个 cpp 文件引用是不行的。因为引用头文件在预编译时直接就将头文件中的内容插入源程序。如果直接将函数定义写在头文件中,然后该头文件被多个 cpp 文件引用,则这些 cpp 文件编译生成的 obj 文件中都含有写在头文件中的函数的定义,所以这些 obj 文件在链接的时候会由于含有重复定义而报错(c++ 中允许变量和函数的申明出现多次,但变量和函数的定义只能出现一次)。

例如:


 1 //gel.h
 2 
 3 int max_(int a, int b){
 4     return a > b ? a : b;
 5 }
 6 
 7 //test1.cpp 
 8 
 9 #include "gel.h"
10 #include <iostream>
11 using namespace std;
12 
13 int main(void){
14     cout << max_(1, 2) << endl;
15     return 0;
16 }
17 
18 //test2.cpp
19 
20 #include <iostream>
21 #include "gel.h"
22 using namespace std;
23 
24 int main(void){
25     cout << max_(10, 2) << endl;
26     return 0;
27 }  

 

解决的方法:

在头文件中只写声明,把定义写到另一个cpp文件中就好啦。。

引用另一个文件的内容除了以头文件的形式外也可以直接将函数写入一个cpp文件,然后在需要引用的地方加个声明,再链接一下就好啦。。。

事实上只要符合语法(主要是不重复定义变量,函数等),也可以将一个 cpp 文件通过头文件引入另一个 cpp 文件中。。。

通常是将函数的声明写入头文件,然后将函数体写到其他 cpp 文件中:


 1 // max.h
 2 int max_(int a, int b);
 3 int max_(int a, int b, int c);
 4 
 5 // a.cpp
 6 #include "max.h"
 7 
 8 int max_(int a, int b){
 9     return a > b ? a : b;
10 }
11 
12 // b.cpp
13 #include "max.h"
14 
15 int max_(int a, int b, int c){
16     return max_(a, b) > max_(b, c) ? max_(a, b) : max_(b, c);
17 }
18 
19 // c.cpp
20 #include <iostream>
21 #include "max.h"
22 using namespace std;
23 
24 int main(void){
25     int a, b, c;
26     cin >> a >> b >> c;
27     cout << max_(a, b) << endl;
28     cout << max_(a, b, c) << endl;
29     return 0;
30 }  

 

转载于:https://www.cnblogs.com/geloutingyu/p/7811668.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于将函数写入头文件问题(分离式编译) 的相关文章

  • C++编程(五)--- Cmake详解&Makefile详解

    C C 43 43 程序员肯定离不开Makefile和Cmake xff0c 因为如果对这两个工具不熟悉 xff0c 那么你就不是一个合格的C C 43 43 程序员 本文对Makefile和Cmake xff0c 及它们的使用进行了详细的
  • 【统计学】第四章

    Evernote Export 一组数据的分布特征可以从那几个方面进行测度 xff1f 数据的分布特征可以从三个方面进行测度和描述 xff0c 一是分布的集中趋势 xff0c 反映各数据向其中心值靠拢或聚集的程度 xff1b 二是分布的离散
  • UG NX安装包大集合(包括UG目前发布的所有版本)

    UG NX安装包大集合 xff08 包括UG目前发布的所有版本 xff09 UG爱好者官方交流群 216953883 有了这个你就不怕找UG安装包麻烦了 xff0c 现在所有安装包全在这里了 所有版本的补丁包也在年后陆续更新 提醒 xff1
  • HTML常用字体代码

    HTML常用字体代码 常用字体 lt FONT style 61 34 FONT SIZE 40pt FILTER shadow color 61 green WIDTH 100 COLOR white LINE HEIGHT 150 FO
  • 线性链式存储结构c语言建立,线性表的链式存储结构(C语言版)

    上一篇博文我对数据结构中线性表的顺序存储结构顺序表 http 12172969 blog 51cto com 12162969 1916336 按照我的理解做了总结 xff0c 今天我继续对顺序表的另一种存储结构 xff0c 链表谈一下我看
  • stract oracle,ORACLE 字符串聚合函数 strCat

    源码如下 xff1a create or replace type strcat type as object currentstr varchar2 4000 currentseprator varchar2 8 static funct
  • ARM存储格式之 大端小端

    开头讲个有关大端小端的故事 xff1a 端模式 xff08 Endian xff09 的这个词出自Jonathan Swift书写的 格列佛游记 这本书根据将鸡蛋敲开的方法不同将所有的人分为两类 xff0c 从圆头开始将鸡蛋敲开的人被归为B
  • 多版本opencv管理; find_package()的原理解析

    近期用cmake编译程序时 xff0c 报错找不到opencv2 由于我电脑里安装了多个版本的opencv xff0c 管理不善 xff0c 借此机会梳理一下思路 1 Cmake find package Opencv REQUIRED x
  • 解决 Flask 项目无法用 .env 文件中解析的参数设置环境变量的错误

    在 Windows 上启动 Flask 项目时 xff0c 工作目录有 UTF 8 编码的 env 文件 xff0c 里面配置的环境变量在 Python2 中识别为 Unicode 类型 xff0c 导致下述错误 xff1a Serving
  • cordova环境搭建

    一 步骤列表 准备依赖环境 安装cordova 创建app xff0c 并build 二 准备依赖环境 1 需要准备的安装包 说明 xff1a gradle下载后 xff0c 解压到硬盘某个目录即可 xff1b 安装步骤 xff1a jav
  • JavaWeb_(Struts2框架)Ognl小案例查询帖子

    创建paste帖子表 CREATE TABLE 96 strutstest 96 96 paste 96 96 id 96 VARCHAR 50 NOT NULL 96 answer 96 INT NULL 96 offer 96 INT
  • socket(二)--Tcp同步非阻塞式

    socket 二 Tcp同步非阻塞式 文章目录 socket 二 Tcp同步非阻塞式一 简介二 关键类2 1 ServerSocketChannel2 2 SocketChannel2 3 Selector2 4 SelectionKey2
  • JavaWeb_(Struts2框架)Action中struts-default下result的各种转发类型

    result是用于做输出的组建 xff0c 用于向页面输出一些内容 xff0c 转发重定向可以理解为特殊方式的输出 xff0c 每一个result就是一个类 这些类都实现了共同的接口Result xff0c struts2预置了10种类型的
  • 第二章平稳时间序列模型——ACF和PACF和样本ACF/PACF

    自相关函数 自相关曲线 ACF AR 1 模型的ACF xff1a 模型为 xff1a 当其满足平稳的必要条件 a1 lt 1时 xff08 所以说 xff0c 自相关系数是在平稳条件下求得的 xff09 xff1a y t 和y t s
  • React项目搭建及依赖安装

    一 前提 首先保证node js已安装完成 安装完成后 xff0c 打开cmd命令行 输入 node v 和 npm v 来查看版本号 xff0c 如果显示则安装完成 二 安装react脚手架 在cmd命令行中输入 xff1a npm in
  • 删除SQL server 实例

    在网上找到下面几种方法 xff0c 本人使用的是第一种 xff0c 很实用 1 删除 SQL Server 的特定实例 若要删除 SQL Server 的某个特定实例 xff0c 请按照以下步骤操作 xff1a 找到并删除 drive Pr
  • 神舟战神 HotKey 主面板无法打开? Fn+Esc失效?

    战神笔记本的 Fn 43 Esc快捷键是打开 HotKey 主面板的 xff0c 其实就是 Control Center Windows更新可能导致 Control Center 无法打开 xff0c 解决办法就是 更新驱动 更新驱动之前
  • K8S镜像删除及环境清理

    环境清理 删除所有容器 sudo docker rm f sudo docker ps qa 删除 var etcd目录 sudo rm rf var etcd 删除 var lib kubelet 目录 xff0c 删除前先卸载 for
  • HTTP认证之摘要认证——Digest(二)

    导航 HTTP认证之基本认证 Basic xff08 一 xff09 HTTP认证之基本认证 Basic xff08 二 xff09 HTTP认证之摘要认证 Digest xff08 一 xff09 HTTP认证之摘要认证 Digest x
  • 关于AD10如何输出自己想要的BOM表

    新年新开始 xff0c 过完年来上班 xff0c 脑子里面的东西很多又忘光了 xff0c 索性写下来做个备忘录 xff0c 今天为了输出一个自己想要的BOM表 xff0c 结果发现去年会弄的 xff0c 但是现在尴尬的又忘了怎么弄了 xff

随机推荐

  • authorization权限控制_shiro入门学习--授权(Authorization)|筑基初期

    写在前面 经过前面的学习 xff0c 我们了解了shiro中的认证流程 xff0c 并且学会了如何通过自定义Realm实现应用程序的用户认证 在这篇文章当中 xff0c 我们将学习shiro中的授权流程 授权概述 这里的授权指的是授予某一系
  • Spring Boot+Spring Security+JWT 实现 RESTful Api 认证(二)

    摘要 上一篇Spring Boot 43 Spring Security 43 JWT 实现 RESTful Api 认证 xff08 一 xff09 我们已经sql教程 实现了基本的登录和token认证接口 xff0c 但是这里有个问题
  • vmware vsphere各版本差别,及各套件差别

    最近要开始全面支持虚拟化了 xff0c 客户私有云环境用的多的为vmware vsphere xff0c 特地恶补下vmware vsphere的各个差别 首先是vSphere xff0c ESXi和vCenter 的区别 ESXi vSp
  • 第五周课程总结&试验报告(三)

    第五周课程总结 xff1a 一 xff1a String类 1 xff1a 实例化String对象 xff0c String可以采取直接赋值的方式进行操作 xff1b 2 xff1a 61 61 可以用来进行内容的比较 xff0c 但是单纯
  • CSS3 选择器

    CSS3 选择器 在 CSS 中 xff0c 选择器是一种模式 xff0c 用于选择需要添加样式的元素 34 CSS 34 列指示该属性是在哪个 CSS 版本中定义的 xff08 CSS1 CSS2 还是 CSS3 xff09 选择器例子例
  • JavaScript中使用typeof运算符需要注意的几个坑

    typeof是一个运算符 xff0c 它对操作数返回的结果是一个字符串 xff0c 有6种 只针对ES xff0c 不包含HOST环境对象 1 39 undefined 39 2 39 boolean 39 3 39 string 39 4
  • unity视频教程

    英雄联盟教程 http pan baidu com s 1i3rkMS9 密码 bv6r https pan baidu com share link shareid 61 2589856556 amp uk 61 371904234 li
  • 相册列表 鼠标悬停显示照片介绍

    lt DOCTYPE HTML PUBLIC 34 W3C DTD HTML 4 01 Transitional EN 34 34 http www w3 org TR html4 loose dtd 34 gt lt html gt lt
  • 图书管理系统(毕业论文)

    毕 业 设 计 论 文 题 目 xff1a 图书管理系统 院 系 xff1a 计算机学院 专 业 xff1a 软件技术 姓 名 xff1a XXX 指导教师 xff1a XX 2017年 10 月 23 日 1 引言 5 2 相关技术突破
  • C#中定义数组--字符串及数组操作

    一 一维 xff1a int numbers 61 new int 1 2 3 4 5 6 不定长 int numbers 61 new int 3 1 2 3 定长 二 多维 int numbers 61 new int 1 2 3 1
  • 迭代器分类

    输入迭代器 读 xff0c 不能写 xff1b 只支持自增运算 istream iterator 61 61 61 43 43 gt 输出迭代器 写 xff0c 不能读 xff1b 只支持自增运算 ostream iterator 43 4
  • VC++中隐藏代码

    1 引言 在VS编辑器中可以对类中的方法 注释等内容进行隐藏 xff0c 单击左侧的 号即可完成隐藏 xff0c 隐藏后变为 43 xff0c 单击 43 号可以将隐藏的代码展开 2 隐藏任意代码 如果想在编辑器中隐藏任意代码段 xff0c
  • 常见签名算法之SHA256withRSA

    概述 在https blog csdn net chinoukin article details 100934995章节中 xff0c 我介绍了用Hmac算法用于签名算法中的方法 xff0c 本章节中将对常见的签名算法 SHA256wit
  • httpclient4封装类与HttpParser封装类

    httpclient4封装类与HttpParser封装类 最近工作中需要做一个爬虫去抓取指定页面的一些内容 xff0c 准备使用HttpParser来解析页面结构 xff0c 顺便看了一下httpclient4 xff0c 可以将它们配合使
  • 【Linux操作系统分析】进程——进程切换,进程的创建和撤销

    1 进程 进程是程序执行时的一个实例 xff0c 可以把它看作充分描述程序已经执行到何种程度的数据结构的汇集 从内核的观点看 xff0c 进程的目的是担当分配系统资源 xff08 CPU时间 xff0c 内存等 xff09 的实体 xff0
  • C++中的.和::和:和->的区别

    在学习C 43 43 的过程中我们经常会用到 和 和 xff1a 和 gt xff0c 在此整理一下这些常用符号的区别 1 A B则A为对象或者结构体 xff1b 2 A gt B则A为指针 xff0c gt 是成员提取 xff0c A g
  • 通过Curl 对url进行encode操作

    最近做项目的时候 xff0c 通过 Gflags Reload 时候 发现对于某些value中包含 61 中文等字符的支持不够好 xff0c value被截断了 经过分析后 xff0c 发现程序对url切分是用 61 amp 为标准的 xf
  • STM32进阶之串口环形缓冲区实现(转载)

    转载自微信公众号 玩转单片机 xff0c 感谢原作者 杰杰 队列的概念 在此之前 xff0c 我们来回顾一下队列的基本概念 xff1a 队列 Queue xff1a 是一种先进先出 First In First Out 简称 FIFO 的线
  • 位和结构体寄存器访问方法(转)

    1 2 1 传统 define 方法 1 2 外设位域结构体方法综述 DSP281x 头文件和外设示例使用位域结构体方法 xff0c 映射和访问基于F28x 外设寄存器 本节将介绍这种方法 xff0c 并把它和传统的 define 方法加以
  • 关于将函数写入头文件问题(分离式编译)

    如果某些函数在其他很多 cpp 文件中被调用 xff0c 那么为了避免写大量重复的代码以及让代码量更小一些 xff0c 我们可以将这些函数写头文件中 xff0c 然后其他 cpp 文件只需要引用该头文件然后就可以使用包含在头文件中的函数了