C++中的导入include,头文件,extern,main函数入口及相关编译流程

结论:

1:#include就是复制粘贴

2:C++编译的时候,在链接之前,各个文件之间实际上没有联系,只有到了链接的阶段,系统才会到各个cpp文件中去找需要的文件;

一:include的作用和头文件

就是复制张贴,所以,一定不能直接include源文件,也就是cpp文件,因为cpp文件中是函数的定义,一旦include了cpp文件,相当于在当前cpp文件又定义了一个相同名字的cpp文件,所以回报错,展示如下:

首先,项目的结构如下:这里,我们用不到src和include,以下均以main.cpp和main2.cpp来作为讲解;

其中main2.cpp内容如下:

 这里展示直接include了cpp文件的结果如下:

编译报错如下:

 

此时如果想用main2.cpp中的内容,可以采用如下的方式,直接在main.cpp中声明main2,而后直接调用,展示如下:

结果如下:

结论如下:

这里我们在main.cpp中直接声明int main2(),其实和在头文件中声明函数是一样的,因为我们引用include头文件的时候就是赋值粘贴,所以相当于,我们这里的声明就是include了头文件;

由此引出我们的重点:声明,其实就是一个承诺,告诉系统,我肯定实现了这么一个函数也好,类也好,变量也好,反正我肯定实现了,我在当前cpp文件中就是要用它,你先别管我在哪实现了;而在编译的时候,各个cpp文件之间实际上是单独编译的,也就是说互不打扰,但是,编译的时候,各个类别,函数,变量啥的会生成一个符号表,链接的时候,各个cpp文件就拿着自己符号表里的东西去所有的编译结果里面去找,找到了变量,类别,函数实现的地方就把他们链接在一起,这也是为什么定义只能有一个的原因,否则链接的时候不知道链接哪一个

所以结合上述内容我们可以理解头文件的作用了,其就是写了所要用到的函数的声明,然后include,也就是复制张贴到目标cpp文件中:其作用效果和我们上面这里直接再cpp文件里面声明一个函数是一样的

很好,现在问题来了,那这样直接声明的函数为什么我们不用加extern呢?因为函数一般都是默认extern的,这部分参考:C++程序员应了解的那些事(82)~extern使用小结_c++ extern建议使用吗_so~what的博客-CSDN博客

 引用外部变量的时候,我们是一定要extern的,但是引用外部函数的时候,不需要extern,实验展示如下:

如果a前面不加int的话则如下:

可以看到,变量a的外部引用是一定要加extern的;

实际上,这源自于我们所熟知的,定义只能有一次,而声明可以有无数次,而对于变量来说:

int a和extern int a=0和int a=0;这三者都是定义,只有extern int a是一个声明:

 而对于函数来说,本来,也是和变量一样,比如,你在定义一个函数的时候,可以加上extern,就是说extern int func(){函数体}相当于上面的extern int a = 0;所以这就是一个定义,而当作为声明的时候就是说extern int func(int x, int y)相当于extern int a;但注意,当声明不加extern的时候,也就是int func(int x, int y)对应int a,注意,我们这里说的是对应,不是相当于,也就是说两者不一样,因为int a是一个定义,但是int func(int x, int y)是一个声明,因为它没有函数体

这就是为什么函数的外部声明不需要加extern的原因,因为函数的声明和定义是完全不同的,迪尼亚需要有函数体,所以不加extern也可以区分,但是变量的声明和定义不加extern是无法区分的!

参考自:C++程序员应了解的那些事(82)~extern使用小结_c++ extern建议使用吗_so~what的博客-CSDN博客

参考自:C++头文件源文件详解 - 知乎 (zhihu.com)

二:main函数入口 

这个问题主要是,我们调试代码的时候,怎么去找函数入口,因为有一些函数入口并不是以main.cpp命名的,所以无法直接看到我们的函数入口在哪里,我现在采用的方式是利用vscode的查找功能,直接查int main字样;

至于系统怎么确认main函数入口的,就是上面说的main函数会生成特定的符号;

 

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

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

相关文章

详解混合类型文件(Polyglot文件)的应用生成与检测

1. 引入 混合类型文件(Polyglot文件),是指一个文件,既可以是合法的A类型,也可以是合法的B类型。 比如参考3中的文件,是一个html文件,可以用浏览器正常打开;它也是一个一个.jar文件&…

OpenCV之怀旧色、冰冻滤镜、熔铸滤镜

怀旧色 源码&#xff1a; void huaijiu(Mat& src,Mat& dst) {for (int h 0;h < src.rows;h ){uchar *d1 src.ptr<uchar>(h);uchar *d2 dst.ptr<uchar>(h);for (int w 0;w < src.cols;w ){int w3 3*w;int r d1[w3 2];int g d1[w3 1];int …

民用大中型无人直升机系统飞行性能飞行试验要求

声明 本文是学习GB-T 42856-2023 民用大中型无人直升机系统飞行性能飞行试验要求. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了民用大中型无人直升机系统飞行性能飞行试验的内容、目的、条件、实施、数据处理和 结果评定等要…

linux相关知识以及有关指令3

在linux的世界中我们首先要有万物皆文件的概念&#xff0c;那么在系统中有那么多的文件&#xff0c;我们该怎么区分呢&#xff1f;文章目录 1. 文件分类2. 文件的权限1). 拥有者和所属组以及other2). 文件的权限3). 粘滞位4). 对于权限修改的拓展知识点a.修改权限b.修改拥有者所…

【MySQL进阶】SQL性能分析

一、SQL性能分析 1.SQL执行频率 MySQL 客户端连接成功后&#xff0c;通过 show [session|global] status 命令可以提供服务器状态信 息。通过如下指令&#xff0c;可以查看当前数据库的 INSERT 、 UPDATE 、 DELETE 、 SELECT 的访问频次&#xff1a; -- session 是查看当…

Linux学习之基础工具二

经过学习我们已经大致的学会了vim的使用&#xff0c;可以利用vim进行代码的编写了&#xff0c;在学习c语言的时候我们就知道&#xff0c;编译完成一个代码需要进行四个步骤&#xff1a; 1. 预处理&#xff08;进行宏替换) 2. 编译&#xff08;生成汇编) 3. 汇编&#xff08;生…

Java实现计算两个日期之间的工作日天数

需求&#xff1a; 需要在后端实现 计算当前日期与数据库内保存的日期数据之间相隔的工作日数目 实现 import java.time.DayOfWeek; import java.time.LocalDateTime;public class WorkdaysCalculator {public static void main(String[] args) {String givenDateTimeStr &q…

HTTPS Tomcat Servlet 博客系统 软件测试的概念 Linux

第 1 题&#xff08;多选题&#xff09; 题目名称&#xff1a; 以下关于http和https说法正确的是 题目内容&#xff1a; A .http是超文本传输协议 B .https是超文本传输安全协议 C .http是明文传输 D .https是加密传输 第 2 题&#xff08;单选题&#xff09; 题目名称…

【计算机视觉】Image Feature Extractors方法介绍合集(一)

文章目录 一、Convolution二、1x1 Convolution三、Depthwise Convolution四、Pointwise Convolution五、Depthwise Separable Convolution六、Grouped Convolution七、Dilated Convolution八、3D Convolution九、Non-Local Operation十、Deformable Convolution十一、Switchabl…

UI自动化测试神器Playwright(Java版)(保存登录cookie,解决免登录)

&#x1f3ad; Playwright在称为浏览器上下文的隔离环境中执行测试。该隔离模型提高了可重复性并防止相关联的测试脚本执行失败。测试可以加载现有的已验证状态&#xff0c;比如获取已登录的状态&#xff08;Cookie&#xff09;&#xff0c;在后续脚本中复用。这消除了在每个测…

【论文笔记】Perception, Planning, Control, and Coordination for Autonomous Vehicles

单纯作为阅读笔记&#xff0c;文章内容可能有些混乱。 文章目录 1. Introduction2. Perception3. Planning3.1. Autonomous Vehicle Planning Systems3.2. Mission Planning3.3. Behavioral Planning3.4. Motion Planning3.4.1. Combinatorial Planning3.4.2. Sampling-Based P…

web安全漏洞-SQL注入攻击实验

实验目的 学习sql显注的漏洞判断原理掌握sqlmap工具的使用分析SQL注入漏洞的成因 实验工具 sqlmap是用python写的开源的测试框架&#xff0c;支持MySQL&#xff0c;Oracle&#xff0c;PostgreSQL&#xff0c;Microsoft SQL Server&#xff0c;Microsoft Access&#xff0c;I…

解决mybatis-plus不能俩表联查分页之手动写分页

public class MyPageHelper {// 调用pageInfo插件内的方法 开启分页 需要传入一个起始页的值和每页显示的条数public static void startPage(PageRequest pageRequest) {PageHelper.startPage(pageRequest.getPageNum(),pageRequest.getPageSize());}// 封装结果集public stati…

【CMU15-445 Part-11】Join Algorithms

Part11-Join Algorithms Why Do We Need to Join? Join其实是关系数据库和范式化表时候所产生的副产物。 也就是说我们范式化表是为了减少冗余信息&#xff0c;而我们使用join就是为了去重建reconstruct 这些原本的tuple Join Algorithms 主要关注两表的inner equijoin a…

01_网络编程_传统IO

网络编程 1.什么是网络编程 在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行的数据传输。 如果想把一个计算的结果&#xff0c;或者是电脑上的文件通过网络传递给你的朋友&#xff0c;就需要用到网络编程。 在实际生活中&#xff0c;网络通信无处不在…

Windows 10 Enterprise LTSC 2021 (x86) - DVD (Chinese-Simplified)文件分享

Windows 10 Enterprise LTSC 2021 (x64) - DVD (Chinese-Simplified) SW_DVD9_WIN_ENT_LTSC_2021_64BIT_ChnSimp_MLF_X22-84402.ISO 镜像文件&#xff1a; 链接&#xff1a;https://pan.quark.cn/s/2f8f61ec4a98 Windows 10 Enterprise LTSC 2021 (x86) - DVD (Chinese-Simpli…

python selenium 爬虫教程

Python和Selenium是很强大的爬虫工具&#xff0c;可以用于自动化地模拟浏览器行为&#xff0c;从网页中提取数据。下面是一个简单的使用Python和Selenium进行爬虫的案例。 入门&#xff1a; 1. 安装和配置&#xff1a; 首先&#xff0c;你需要安装Python和Selenium。可以使用…

Postman的高级用法一:重新认识postman核心模块

本请求示例来自于免费天气API&#xff1a; 实况天气接口API开发指南 未来一天天气预报api - 天气API 关于Postman的核心模块 全局变量请求接口请求体预处理脚本 类似beforeTest&#xff0c;在发起请求前的预执行逻辑&#xff0c;通常是生成一些动态变量值 测试用例模块 测试者…

开源社区赋能,Walrus 用户体验再升级

基于平台工程理念的应用管理平台 Walrus 已于上月正式开源&#xff0c;目前在 GitHub 已收获 177 颗星&#x1f31f; Walrus 希望打造简洁清爽的应用部署与管理体验&#xff0c;帮助研发与运维团队减少“内耗”工作&#xff0c;提升开发体验。 我们十分重视 Walrus 用户的…

Ubuntu安装深度学习环境相关(yolov8-python部署)

Ubuntu安装深度学习环境相关(yolov8-python部署) 本文将从如下几个方面总结相关的工作过程&#xff1a; Ubuntu系统安装(联想小新pro16) 2.显卡驱动安装3.测试深度学习模型 1. Ubunut 系统安装 之前在台式机上安装过Ubuntu&#xff0c;以为再在笔记本上安装会是小菜一碟&…