头文件和源文件的一些情况分析

c++函数的定义和声明

函数和变量的声明可以有多次,但是定义只能有一次

其实头文件可以写函数的定义,但是在工程里面很多人引用这个头文件很容易造成重复定义的情况

有一个例外情况头文件里面也可以写函数定义或者变量定义

一般情况
//2.h
#pragma once
int add(int a, int b);int div1(int a, int b) {return a - b;
}
//1.cpp
#include<iostream>
#include "2.h"
using namespace std;int main() {cout << add(1, 2) <<endl;return 0;
}
//3.cpp
#include "2.h"

重复定义了

法一:加上static
//2.h
#pragma once
int add(int a, int b);static int div1(int a, int b) {return a - b;
}

发现没有报错

加了static以后函数仅在原文件中生效,所以可以被不同的cpp原文件引入

法二:加上inline
//2.h
#pragma once
int add(int a, int b);inline int div1(int a, int b) {return a - b;
}

也没有报错

变量同理

嵌套头文件包含问题

若2.h调用3.h,3.h调用2.h

这样的话我在头文件里面写了一个static函数的定义,会不会有很多个div1函数

//2.h
#include "3.h"
int add(int a, int b);inline int div1(int a, int b) {return a - b;
}
//3.h
#include "2.h"

报错

法一:头文件里面加上#pragma once
//2.h
#pragma once
#include "3.h"
int add(int a, int b);inline int div1(int a, int b) {return a - b;
}
//3.h
#pragma once
#include "2.h"

这样的话嵌套调用就可以只调用一次了(不代表整个工程只引用一次)

但是有的编辑器不支持

而且加了#pragma once,直接就是整个文件了,不能针对文件的部分

下面介绍一个万能解决办法

法二:宏定义来解决问题
#ifndef _HE2_
#define _HE2_
```
```这中间写想只被编译一次的内容
```
#endif

这个方法也可以控制软件的版本

extern-解决c和cpp混用的问题

//4.c
int add(int a, int b) {return a + b;
}
//1.cpp
#include<iostream>
using namespace std;int add(int a, int b) {return a + b;
}int main() {cout << add(1, 2) <<endl;return 0;
}
//2.h
#pragma once
int add(int a, int b);

发现不报错

把4.c改成4.cpp

注意函数名字后面加的这一条,这在c++里面是为了实现函数的重载,所以要加那么一串(函数名代表地址)

把1.cpp改成1.c

//1.c
#include<stdio.h>
int add(int a, int b) {return a + b;
}
int main() {printf("%d",add(1, 2));return 0;
}

报错

若在1.cpp中调用4.c的add(),用不了,因为c语言不支持重载(所以c语言的编译器不会在函数后面加那一串小尾巴)

那么怎么在cpp中调用c文件呢?

//1.cpp
#include<iostream>
#include "4.h"
using namespace std;int main() {cout << add(1, 2) <<endl;return 0;
}
//4.h
extern "C" int add(int a, int b);
//4.c
int add(int a, int b) {return a+b;
}

在头文件定义时候加上extern "C"

如果有多个函数

extern "C" {int add(int a, int b);int div1(int a, int b);
}

如果需要把几个c语言的头文件全部加进来

extern "C" {#include "2.h";#include "3.h";
}

C语言不能调用cpp(没有办法)

注意事项

如果c文件调用那个头文件带了extern "C",就会报错

解决办法

采用宏定义来控制其在cpp调用c语言函数时候加上extern "C"

#ifdef __cplusplus
extern "C"
#endif

当你把c语言的函数定义成为extern "C",这个函数名就不支持函数重载了

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

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

相关文章

百分之九十的人都忽视了JMeter响应断言中的这个实用功能—— Jmeter Variable Name to use

JMeter的响应断言 相信对于使用过JMeter的同学来学&#xff0c;一定都使用过响应断言&#xff0c;在这里我就不相信介绍了&#xff0c;我们可以简单的理解为&#xff1a; JMeter的响应断言是一种用于检查测试中得到的响应数据是否符合预期的工具&#xff0c;旨在保证性能测试…

2024最新python入门教程|python安装|pycharm安装

前言&#xff1a;在安装PyCharm之前&#xff0c;首先需要明确PyCharm是一款功能强大的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;由JetBrains公司开发。PyCharm旨在通过提供智能代码补全、语法高亮、代码检查、快速导航和重构等丰富的编码辅助工具&#xff0c…

在无GPU的windows上运行ChatTTS

如果你在安装的过程中出现了下面的错误&#xff0c;不妨先看看这些安装步骤&#xff1a; cl: 命令行 error D8021 :无效的数值参数“/Wno-register” error: command C:\ windows ERROR: Failed building wheel for pynini 卷完了文本&#xff0c;卷图片&#xff0c;卷完了图…

AI 入门指南二 :AI提示词(Prompt)

一&#xff0c;提示词的定义 提示词在中文中意为“触发”&#xff0c;在自然语言处理&#xff08;NLP&#xff09;的领域&#xff0c;它更接近于一个“心领神会”的概念&#xff0c;而非具有明确定义的术语。 简而言之&#xff0c;提示词是用户对大型语言模型的输入&#xff0…

电脑自动关机怎么设置?简单3步就能搞定

电脑自动关机功能在许多场景下非常实用&#xff0c;例如下载大文件后自动关机、长时间不使用电脑后自动关机以节省能源等。通过合理设置自动关机&#xff0c;可以提高电脑使用的便利性和节能效果。本文将介绍电脑自动关机怎么设置的三种方法&#xff0c;帮助您根据不同需求灵活…

详解51种企业应用架构模式

文章目录 什么是企业应用企业应用的种类企业架构模式关于作者 导读&#xff1a;企业应用包括哪些&#xff1f;它们又分别有哪些架构模式&#xff1f;世界著名软件开发大师Martin Fowler给你答案 什么是企业应用 我的职业生涯专注于企业应用&#xff0c;因此&#xff0c;这里…

物理隔离条件下文件交换的防泄密U盘,企业该如何选择?

对于网络安全要求高的企业和单位&#xff0c;往往采用物理隔离的方式进行网络建设&#xff0c;如政府单位、军工、科研所、航空航天企业、以及部分金融机构、医疗单位、电力企业、生物制药实验室等。 但物理隔离后&#xff0c;仍然存在着隔离网间的数据交换需求&#xff0c;此时…

AIGC专栏11——EasyAnimateV2结构详解与Lora训练 最大支持768x768 144帧视频生成

AIGC专栏11——EasyAnimateV2结构详解与Lora训练 最大支持768x768 144帧视频生成 学习前言源码下载地址EasyAnimate V2简介技术储备Diffusion Transformer (DiT)Motion ModuleU-VITLora 算法细节算法组成视频VAE视频DIT 数据处理视频分割视频筛选视频描述 模型训练视频VAE视频D…

vue动态加载组件import引入组件找不到组件(Error: Cannot find module)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

Flutter开发效率提升1000%,Flutter Quick教程之定义Api(三)

将tab键切换到Response&#xff0c;会出现这么一个界面 这是添加api返回的json数据。比如我们添加一个json数据。 添加完json数据后&#xff0c;右上角有一个删除按钮。要换json数据的话&#xff0c;可以点击清除再重新输入。 这时候&#xff0c;左边的面板上还会显示出 这个的…

防勒索软件的功能特点

随着信息技术的飞速发展&#xff0c;网络安全问题日益凸显&#xff0c;其中勒索软件(也称为勒索病毒)的威胁尤为严重。勒索软件通过加密用户数据或锁定用户系统来威胁用户支付赎金&#xff0c;一旦感染&#xff0c;用户将无法正常访问或使用其重要数据&#xff0c;导致严重的经…

Python02:python代码初体验

0、python代码初体验 print(hello,world)看到执行结果输出&#xff0c;则OKK! 1、输出结果取消换行 当print多个执行结果&#xff0c;又希望它们在同一行展示时&#xff1a; print(hello,world, end)print(Hao are, end ) print(you, end?) print(I am fine.) # end参数可…

C++——从C语言快速入门

目录 一、数组 1、声明数组 2、初始化数组 3、访问数组元素 4、示例 5、注意事项 6、数组小练习 计算器支持加减乘除 数组找最大值 二、指针 三、字符串 string 类型 一、数组 在 C 中&#xff0c;数组是一种存储固定大小的相同类型元素的序列。数组的所有元素都存…

白银票据~

一. 白银票据的原理 白银票据就伪造ST票据&#xff0c; kerberoasting是破解ST票据中的服务用户hash值&#xff0c;有以下区别&#xff1a; 白银票据&#xff1a;伪造的ST使用的是机器用户的Hash值 Kerberoasting:破解的是ST的域用户的hash值二. 白银票据的利用条件 1.域名 …

操作失败——后端

控制台观察&#xff0c;页面发送的保存菜品的请求 返回的response显示&#xff1a; ---------- 我开始查看明明感觉都挺正常&#xff0c;没啥错误&#xff0c;就是查不出来。结果后面电脑关机重启后&#xff0c;隔一天看&#xff0c;就突然可以了。我觉着可能是浏览器的缓存没…

【学习】DCMM认证提升企业竞争优势的表现

DCMM认证是企业提升数据管理能力的重要途径。它不仅可以帮助企业评估自身的数据管理水平&#xff0c;还可以为企业提供改进的方向和目标。在数字化时代&#xff0c;拥有强大的数据管理能力是企业成功的关键。因此&#xff0c;通过DCMM认证&#xff0c;企业可以更好地适应数字化…

ruoyi-nbcio基于jeecg的flowable前端支持自定义表单组件的自动获取方法

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

5 种技术,可用于系统中的大数据模型,而不会使系统崩塌

文章目录 一、说明二、第一种&#xff1a;批量大小三、第二种&#xff1a;主动学习四、第三种&#xff1a;增加代币数量五、第四种&#xff1a; 稀疏激活六、第五种&#xff1a;过滤器和更简单的模型后记 一、说明 以下是本文重要观点的摘要。阅读它以获取更多详细信息/获取原…

《深入浅出存储引擎》不同数据库背后的数据存储方案

在大数据和AI时代&#xff0c;数据库成为各类应用不可或缺的重要组成部分。而数据库中的数据依赖存储引擎进行管理&#xff0c;包括数据的存储、查询、更新和删除等。因此&#xff0c;在设计系统时&#xff0c;选择正确的数据库存储引擎方案变得尤为重要。这篇文章将以关系型、…

会计电子档案系统方案

会计电子档案系统方案是指建立一个以电子方式存储和管理会计档案的系统。该方案具体包括以下几个方面&#xff1a; 1. 系统架构设计&#xff1a;确定系统的组成以及各个组件之间的关联和交互方式。包括数据库设计、系统服务器和客户端的部署等。 2. 电子档案管理&#xff1a;建…