首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么将C++头函数放在单独的文件中?

为什么将C++头函数放在单独的文件中?
EN

Stack Overflow用户
提问于 2016-08-09 13:20:41
回答 3查看 55关注 0票数 0

我正在学习C++教程,在其中一篇关于预处理程序/头文件的文章中,作者创建了2个‘头文件’(当然不是技术术语),例如h和example.cpp。例如,他将函数和头保护的前向声明放在前面,在example.cpp中放置函数的实际正文。为什么会这样呢?我试着把函数的主体放在example.h文件中,它工作得很好,那么他为什么要把它分开呢?这是习惯性的,还是在更大的问题上造成了问题?不然呢?

谁能告诉我这件事..。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-09 13:29:36

C++有一个名为“一个定义规则”的规则,它规定每个函数只需要定义一次,而且只需要定义一次(这个规则有几个例外,但我们现在将忽略它们)。通常包含在头文件中的函数原型是声明函数存在的声明,.cpp文件中的实现是给出函数代码的定义。

如果将函数的定义放在头文件中,然后将头文件包含在多个位置,则会得到链接器错误,因为您违反了一个定义规则--每个已编译的.cpp文件都将有它自己的函数定义副本。另一方面,如果您只是将声明放在头文件中,然后将定义放在一个源文件中,那么只有一个定义,没有什么会中断。

一个定义规则有几个例外。首先,所有内联函数都不受ODR的限制,因此,如果标记所有函数inline,则可以将函数定义放入头文件中,尽管对于所有函数(最小的函数除外)来说,这通常都不是一个好主意。其次,模板函数不受ODR的约束,ODR(除其他外)是看到标头中定义的模板函数的原因之一。

票数 2
EN

Stack Overflow用户

发布于 2016-08-09 13:25:18

以功能体为例。然后,当您编写包含example.h的第二个.cpp文件并将其链接到example.cpp时,您将得到一个链接器错误。链接器将在example.h中看到函数的两个定义。

票数 1
EN

Stack Overflow用户

发布于 2016-08-09 13:24:54

因为在头文件中,您只声明在使用自定义链接配置时非常重要的函数。例如,如果在文件对象中定义了函数,并在另一个对象中使用函数,则链接器必须对此函数具有相同的引用才能链接这两个不同的文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38860642

复制
相关文章
当前对象与父对象(this\super)
this是自身的一个对象,代表对象本身,是非静态对象,可以理解为:指向对象本身的一个指针。
星哥玩云
2022/09/14
5450
当前对象与父对象(this\super)
ActiveRecord 模型验证
比如:file 验证图片 图片可以为空、类型只能是jpg、png或者gif,最大10M等
友儿
2022/09/11
3860
sharedpreferences如何保存对象
昨天做了一个搜索历史的功能,然后根据搜索的历史可以调回到上一个页面,这里涉及到一个用sharedpreferences保存对象的问题,sharedpreferences是不能够直接保存对象的,我们需要将对象序列化成一个字符串进行存储。 例如:PlayList这样一个对象 public static void getJsonStringByEntity(Context context, Object object) { String strJson = ""; Gs
xiangzhihong
2018/02/02
1.4K0
【Java】 JVM 如何保存 Java 对象
本文主要讲解一下在 JVM 中如何保存 Java 对象以及 Java 对象指针压缩相关的东西。
零式的天空
2022/03/27
1.1K0
Python之对象的永久保存模块---p
经常遇到在Python程序运行中得到了一些字符串、列表、字典等数据,想要长久的保存下来,方便以后使用,而不是简单的放入内存中关机断电就丢失数据。
py3study
2020/01/20
9590
获取activexobject对象失败_在各种管理对象中最重要的是
一共有3种方法可用于创建一个空文本文件,这种文件有时候也叫做文本流(text stream)。
全栈程序员站长
2022/11/04
1K0
java 解决父构造器中拿到对象
这两天被问到一个有意思的问题,就是如果在构造器中拿到匿名对象。 这个问题有意思在,直觉上是可以通过外部放一个成员变量去接,然后后续就可以使用了,但实际不行。
潇洒
2023/10/20
1180
指定一个创建对象的方法,如果对象存在则直接返回
单例模式确保一个类只有一个实例,只能自己的内部实现实例化,当他人再次实例化时返回第一次实例化的对象。
用户8983410
2021/10/08
3.2K0
OC基础关联对象AssociationObject如何保存的
主要分析在runtime中关联对象操作是如何实现的,数据对象时如何保存的及关联对象的释放。
Light413
2020/04/08
7390
OC基础关联对象AssociationObject如何保存的
day77-<项目>-exclude、instance媒介对象、对象保存赋值再操作
1.在forms.py文件中,exclude的使用 image.png 2.继承方法(心得) image.png 3.出书化instance关键字的高级用法 image.png 4.执行新增(编辑)操作之后跳转回源页(刚才浏览的页码) image.png 5.再次注意 url 中的关键字分组和reverse反转传参 07.2.png 08.png 6.对象保存之后赋值的再操作 image.png
少年包青菜
2019/10/21
5930
Java 父类子类的对象初始化过程
对于一个简单类的初始化过程是: static 修饰的模块(static 变量和 static 块) => 按照代码顺序依次执行。 ↓ 实例变量 及非 static 模块 => 按照代码顺序依次执行。 ↓ 构造函数 => 执行对应的构造函数。
Cell
2022/02/25
1K0
【JavaSE专栏63】多态,父类引用子类的对象,面向对象编程中的重要概念
本文讲解了 Java 中面向对象多态的概念及语法,并给出了样例代码。多态是面向对象编程中的一个重要概念,它允许使用父类的引用变量来引用子类的对象,实现对不同子类对象的统一处理。
Designer 小郑
2023/08/02
5110
【JavaSE专栏63】多态,父类引用子类的对象,面向对象编程中的重要概念
使用@Autowired注入父类对象时会报错,找到多个bean对象处理
当一个父类拥有子类时,通过@Autowired注入父类对象时会报错,无法区分注入的对象是父对象还是子对象。
bug专8
2021/01/07
4K0
mysql中保存并操作json对象
"At the end of the day, we can endure much more than we think we can.—— Frida Kahlo"
小闫同学啊
2020/03/25
14.2K0
json转换对象失败_java对象转json字符串
没有无参构造函数,再json转换的时候bean类要加上无参构造函数,如JsonResult Json转对象失败:”No suitable constructor found for type [simple type, class com.test.faster.domain.respons 今天自己定制一个json转换对象的方法,转换过程中报错:
全栈程序员站长
2022/11/17
1.9K0
子组件传对象给父组件_react子组件改变父组件的状态
sendData = () => { let data = ‘1234’; this.props.getData(data); //这个this,props.xxx 后面的xxx是是在父组件那使用的名字; }, 然后可以在render函数后使用这个方法或者另外定义一个事件去触发该方法进行传值,
全栈程序员站长
2022/10/04
2.8K0
Django之model模型对象验证
当调用模型的full_clean() 方法时,这三个方法都将执行。当使用ModelForm时,is_valid() 将为表单中的所有字段执行这些验证。如果你计划自己处理验证出现的错误,或者你已经将需要验证的字段从ModelForm 中去除掉,你只需调用模型的full_clean() 方法。
菲宇
2019/08/14
1.4K0
JSON对象标记语法验证类
在接触过JsonPath工具,我发现了使用标记语法编写文本形式的验证的可行性。在完成了基本JsonPath功能封装和Groovy终极重载操作符功能之后,自我感觉已经非常完善了,所以停了一阵子。之前的成果如下:
FunTester
2021/01/05
7370
父元素opacity属性对子元素的影响(子元素设置opacity无效)
这段时间做了一个项目优化,对于原有的内容进行了重新设计实现,其中一项就是对于label标签添加hover层进行解释说明,最常用的办法及时label的容器设置relative,然后hover层作为它的子元素设置absolute,然后在使用label的hover伪类来控制hover层的显示和隐藏,这其中一个要求及时hover层必定要求能够遮住页面中其他的元素,所以最常用的办法是设置它的背景颜色,然后让它的z-index处于合理的位置,一切都是这样设计的,但是最终的效果却出现了hover层设置bg为#fff的时候,hover层显示时还是会把底部内容给透出来,第一反应就是opacity设置为1,但是还是没有效果(因为背景为白色,所以有点坑)
全栈程序员站长
2022/09/01
3.1K0
父元素opacity属性对子元素的影响(子元素设置opacity无效)
Java 反射获取父类实例化对象中的值
想通过反射将父类实例化一个子类,使用如下方案: try { Field[] fields = super.getClass.getDeclaredFields(); for (Field field : fields) { field.setAcessible(true); Method method = super.getClass().getDeclaredMethod("get" + upperHeadChar(field.getName()));
zucchiniy
2019/10/30
5.5K0

相似问题

如果对子对象验证失败,则不会在父对象上调用IValidatableObject.Validate

110

父对象的有效批注对子对象无效

113

ActiveRecord:保存多个对象时跳过验证

22

当父对象无效时,如何防止保存ActiveRecord子对象?

24

如果保存后重定向不是保存的对象,则验证失败

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文