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

news2024/12/23 0:22:03

结论:

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.coloradmin.cn/o/1015889.html

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

相关文章

vue2必备知识点

1、生命周期钩子是如何实现的? 生命周期描述beforeCreatevue实例初始化后,数据观测(data observer)和事件配置之前。data、computed、watch、methods都无法访问。createdvue实例创建完成后立即调用 ,可访问 data、computed、wat…

前端JavaScript中MutationObserver:监测DOM变化的强大工具

🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 引言 1. MutationObserver简介 2. MutationObserver的属性 3. MutationObserver的应用场景 3.1 动态内容加载 …

动手学深度学习_个人笔记01_李沐(更新中......)

序言 神经网络——本书中关注的DL模型的前身,被认为是过时的工具。 深度学习在近几年推动了CV、NLP和ASR等领域的快速发展。 关于本书 让DL平易近人,教会概念、背景和代码。 一种结合了代码、数学和HTML的媒介 测试深度学习(DL&#xf…

FL Studio21.1.1.3750中文破解百度网盘下载地址含Crack补丁

FL Studio21.1.1.3750中文破解版是最优秀、最繁荣的数字音频工作站 (DAW) 之一,日新月异。它是一款录音机和编辑器,可让您不惜一切代价制作精美的音乐作品并保存精彩的活动画廊。 为方便用户,FL Studio 21提供三种不同的版本——Fruity 版、…

TrOCR——基于transformer模型的OCR手写文字识别

前期我们使用大量的篇幅介绍了手写数字识别与手写文字识别,当然那里主要使用的是CNN卷积神经网络,利用CNN卷积神经网络来训练文字识别的模型。 这里一旦提到OCR相关的技术,肯定第一个想到的便是CNN卷积神经网络,毕竟CNN卷积神经网络在计算机视觉任务上起到了至关重要的作用…

打造“共富果园” 广东乳源推动茶油全产业链高质量发展

新华网广州9月13日电(李庆招)金秋九月,瓜果飘香,油茶也将迎来采摘期。13日,一场以“中国健康油 茶油新势力”为主题的乳源茶油12221市场体系之产业大会暨供销对接会在广州举行。来自茶油行业的专家、企业家齐聚一堂&am…

Python模块之time中时间戳、时间字符与时间元组之间的相互转换

时间的三种形式 时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。 1694868399 时间格式字符串,字符串形式的时间。 2023-09-16 20:46:39 时间元组(struct_time),包含9个元素。 time.struct_time(tm_year2023, …

2023 IDC 中国未来企业大奖优秀奖公布,神策数据助力中信建投获“未来运营领军者”优秀奖称号...

今日,全球领先的 IT 市场研究和咨询公司 IDC 正式公布 2023 IDC 中国未来企业大奖优秀奖名单,神策数据的合作客户中信建投证券股份有限公司(简称“中信建投”)荣获“未来运营领军者”优秀奖称号。 该奖项是 ICT 领域最具权威的奖项…

直线导轨滑块的固定方式

直线导轨滑块是要安装到导轨上的,利用压力使得滑块固定到导轨上,并调整间隙精度,当机械中有振动或冲击力浸染时,滑块和滑轨很有可能发生松动,从而偏离原来的固定地位,影响运行精度与操作寿命,甚…

RADIUS协议基础原理

RADIUS简介 Radius概述Radius架构(c/s模式)Radius特点Radius报文Radius认证报文Radius计费报文Radius授权报文 Radius工作原理 Radius概述 RADIUS(Remote Authentication Dial-In User Server,远程认证拨号用户服务)是一种分布式的、C/S架构…

Java设计模式-结构性设计模式(外观设计模式)

简介 ⻔⾯模式,隐藏系统的复杂性,并向客户端提供了⼀个客户端可以访问系统的接⼝定义了⼀个⾼层接⼝,这个接⼝使得这系统更加容易使⽤应用场景 xxx是负责消息推送这个⼯作,看起来很轻松,但他们不知道⾥⾯有多复杂&…

Jenkins结合allure生成测试报告

前言: 我们在做自动化测试的过程中最重要的肯定是报告的输出啦,最近几年allure可以说是最最主流报告展示工具啦。 一、服务端安装allure 在安装Jenkins的机器 安装allure,我们在Jenkins上能跑动前提是在对应服务器上代码能正常运行&#xf…

ESP8266使用记录(一)

1、23.7.17从TB买了个8266 2、下载安装Arduino 3、卖家的配套资料,直接覆盖相关文件 4、文件-首选项-设置-编辑器语言-中文(简体) 其他开发板管理器地址 http://arduino.esp8266.com/stable/package_esp8266com_index.json 5、工具-端口-COM6 工具-开发板-esp8266…

直接插入排序(C++实现)

文章目录 1. 基础概念🍑 内部排序和外部排序 2. 直接插入排序3. 动图演示4. 代码实现5. 性能分析 无论是日常生活还是很多科学领域当中,排序都是会经常面对的问题,比如按成绩对学校的学生排序,按薪水多少对公司员工排序等。 根据…

Vue系列之入门篇

前言: 目录 一,关于Vue的简介 1.什么是Vue? 2.使用Vue框架的好处? 3. 库和框架的区别: 4. MVVM的介绍 5.Vue的入门案例 二,Vue的生命周期 一,关于Vue的简介 1.什么是Vue? Vu…

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

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

来看看Javadoc(文档注释)详解

Java 支持 3 种注释,分别是单行注释、多行注释和文档注释。文档注释以/**开头,并以*/结束,可以通过 Javadoc 生成 API 帮助文档,Java 帮助文档主要用来说明类、成员变量和方法的功能。 文档注释只放在类、接口、成员变量、方法之前…

代码随想录算法训练营第53天 | ● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和

文章目录 前言一、1143.最长公共子序列二、1035.不相交的线三、53. 最大子序和总结 前言 动态规划 一、1143.最长公共子序列 确定dp数组(dp table)以及下标的含义 dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的…

​云南财经大学《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作

​云南财经大学《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作

掌握这5种方法,让你的新AirPods充电盒更耐用!

每次AirPods充电盒落地时,你都会呼吸急促吗?无论我使用的是旧一代的AirPods还是最新的AirPod Pro 2,我都关心它们的保存状况,并尽力保护这些脆弱设备的安全。我想我对AirPods Pro 2的新充电盒也会有同样的感受,它在9月…