为什么类的定义应当写在头文件中,从而被多个源文件包含?

2023-05-16

比如myclass.h定义了一个类myclass(只定义类,不定义成员函数),
file1.cpp里#include "myclass.h",编译得到file1.obj;
file2.cpp里也#include "myclass.h",编译得到file2.obj;
那么把file1.obj和file2.obj(和运行库)连接起来生成可执行文件的时候,为什么不会有冲突呢?2个文件都包含了myclass类的定义。

答:


因为这遵守“单一定义规则”(One-Definition Rule, ODR)。根据此规则, 如果对同一个类的两个定义完全相同且出现在不同编译单位,会被当作同一个定义。
这里头文件分别被两个不同的编译单位(file1.cpp, file2.cpp)包含,满足ODR规则,会被当作同一个定义。 所以不会有冲突。
此外,模板和inline函数也适用此规则。
追问

类的定义在目标文件比如file1.obj里是怎么体现的呢?它产生目标代码吗?类的定义不是变量名,也不是函数名,那么在代码段、数据段或符号表里面应该都没有条目?
还是说,类的定义只是让编译器识别下文的这个类名?而对目标文件没有任何体现?
回答

细节依赖于编译器的实现。
以g++为例,类的代码出现在包含类方法定义的编译单元,引用他的编译单元会在链接时寻找类代码。如果.h中在类定义大括号内直接定义了函数,
那么类代码会出现在每一个include这个.h的编译单元中。 以前者为例:
myclass.h:
class MyClass
{
public: MyClass(int i);
  void add();
  int m;
};

myclass.cpp:
#include "myclass.h"
MyClass::MyClass(int i)
{
this->m = i;
  add();
}
void MyClass::add()
{
this->m ++;
}
file1.cpp:
#include "myclass.h"
void f1()
{
MyClass mc(10);
}
file2.cpp:
#include "myclass.h" void f2()
{
MyClass mc(20);
}
main.cpp:
int main()
{
 void f1();
void f2();
f1();
f2();
}


可见类代码在myclass.o, file1.o在类定义的帮助下,通过_ZN7MyClassC1Ei引用类方法代码。
其它细节可以反汇编代码、看elf/pe等文件格式文档以及编译器源代码。
所谓的编译只编译cpp文件,.h文件不参与编译,头文件的作用就是告诉编译器,
有这个类,但是类的实现在其他位置,编译时,编译器不会去找类的实现,
链接时编译器才会去寻找这个类的实现。

 

转载于:https://www.cnblogs.com/baoxiaofei/p/4189645.html

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

为什么类的定义应当写在头文件中,从而被多个源文件包含? 的相关文章

  • 查看supervisor启动日志

    2019独角兽企业重金招聘Python工程师标准 gt gt gt tail f var log messages 转载于 https my oschina net u 3371661 blog 3045059
  • 嵌入式就业前景怎么样?嵌入式工作该如何分类?

    随着科技进步 xff0c 嵌入式的出现 xff0c 以及人们对生活质量 xff0c 产品的智能化 xff0c 成本的要求等 xff0c 以及国家对与物联网 电子 科技的扶持 xff0c 大量的电子产品都促使嵌入式的快速发展 嵌入式涵盖了微电
  • 【vivado】ILA调试报错 The debug hub core was not detected 以及 Data read from hw_ila [hw_ila_1] is corrupted...

    报错一 xff1a WARNING Labtools 27 3361 The debug hub core was not detected Resolution 1 Make sure the clock connected to the
  • 面试题:你在项目中遇到哪些问题?

    你在项目中遇到哪些问题 xff1f 因为目前项目采用的是分布式 xff0c 分布式环境下一般采用集群方案 xff0c 所以这就会带来分布式的一些问题 xff0c 比如 xff1a 1 分布式锁 2 分布式session 3 分布式全局id
  • 检查 ubuntu 版本_如何检查Ubuntu版本–快速简便的方法

    检查 ubuntu 版本 In this tutorial we will go over the easiest methods to check Ubuntu version from the terminal You can use
  • hashheap python 实现

    class Node object 34 34 34 the type of class stored in the hashmap in case there are many same heights in the heap maint
  • Cocos Creator 实现大厅+子游戏模式

    大厅 43 子游戏的模式 xff0c 在棋牌类型 教育类型游戏中比较常见 xff0c 通常是安装包里面只有大厅的资源和代码 xff0c 然后子游戏根据需求以热更新的方式下载来提供给玩家 之前一直负责的是cocos2dx lua的开发 xff
  • matlab练习程序(Kruskal最小生成树)

    老物了 xff0c 网上的例子多的数不过来 不过我还是有必要练习一下的 之所以看这个算法是因为最近在看颜色聚合向量时 xff0c 有的论文用到了最小生成树 xff0c 因此我就拿来熟悉一下 Kruskal算法类似于连通分支算法 xff0c
  • Ubuntu18.04创建新的系统用户

    目标 xff1a 1 为测试学习Docker xff0c 在虚拟机OS为18 04里 xff0c 创建一个系统账号 xff0c 账号名称 xff1a docker 2 在 home下有新建username的文件夹 一 建立账号 1 以roo
  • gooreplacer 很好用

    国内上 StackOverflow hackernews 之类的站点会慢 因为页面里有链接指向 google 谷歌 会被墙 于是拖累了整个页面的显示 gooreplacer 可以把这些被墙连接替换掉 安装方法的话 xff0c 在浏览器的安装
  • vscod 技巧,自动循环书写li

    ul gt li 10 这是第 个li lt ul gt lt li gt 这是第1个li lt li gt lt li gt 这是第2个li lt li gt lt li gt 这是第3个li lt li gt lt li gt 这是第4
  • Ai challenger 2017 image caption小结

    参加了今年的 ai challenger 的 image caption比赛 xff0c 最终很幸运的获得了第二名 这里小结一下 Pytorch 越来越火了 前五名有三个 pytorch xff0c 两个 tensorflow 关于哪个 l
  • 哥很无奈 今天看到我的host文件是这个样子

    127 0 0 1 www gtxp2 com 这家无良公司在所谓的网维工具内加入了屏蔽我站的信息 xff0c 我们也是不得已做出反击 xff0c 望见者谅解 127 0 0 1 gtxp2 com 封死此无良网站 xff0c B4此站的相
  • [转载] 以下划线开头的变量

    转自 xff1a https blog csdn net Grevi article details 60581354 今天在公司看 GNU ISO C 43 43 Library库中的stl库时 xff0c 偶然间感觉到一个问题 xff0
  • 如果编程语言是武侠

    如果是武功 C紫霞神功要大成需要很长时间 xff0c 威力还行Cpp九阳神功威力巨大Lisp小无相功你可以把它当做任何武功Shell太极拳四两拨千斤PHP打狗棒法不上台面 xff0c 但威力惊人Java八荒六合唯我独尊神功 无敌C 北冥神功
  • 跳转位置-更改目录(CD)PowerShell命令,可让您读懂

    There 39 s a lovely little utility called autojump for nix consoles that makes the 39 cd 39 command very smart More that
  • C#结构体指针的定义及使用详解

    在解析C 结构体指针前 xff0c 必须知道C 结构体是如何定义的 在c 中同样定义该结构体 C 结构体指针之C 结构体的定义 xff1a StructLayout LayoutKind Sequential public struct V
  • Permutation Test 置换检验

    显著性检验通常可以告诉我们一个观测值是否是有效的 xff0c 例如检测两组样本均值差异的假设检验可以告诉我们这两组样本的均值是否相等 xff08 或者那个均值更大 xff09 我们在实验中经常会因为各种问题 xff08 时间 经费 人力 物
  • LaTeX 中使用三级标题

    需要在导言区加入命令 xff1a setcounter secnumdepth 4 而后 xff1a section 一级标题 subsection 二级标题 subsubsection 三级标题

随机推荐

  • 为啥程序员下班后只关显示器从不关电脑?

    阅读本文大概需要 3 分钟 你下班时是不是只将显示器一关 xff0c 揣上手机就走了 xff1f 曾有安保人员晚上来办公室巡查时问 xff0c 为什么这些人不关机就下班呢 xff1f 作为程序员 xff0c 你会心一笑 对方不明白如果关机了
  • 美国 ZIP Code 一览表

    Zip Code 这个是美国的邮政编码 美国目前只有邮政是国营的 其余的产业都不是国营的 今天给大家提供美国的Zip Code的原因是大家在注册国外的账号时 需要提供这个Zip Code 因为一般美国的服务默认是面向美国的 甚至是仅支持美国
  • pytorch .detach() .detach_() 和 .data用于切断反向传播

    参考 xff1a https pytorch cn readthedocs io zh latest package references torch autograd detachsource 当我们再训练网络的时候可能希望保持一部分的网
  • UPX使用教程

    UPX是一个通用可执行文件压缩器 xff0c 由于其具有 xff1a 压缩率高 xff1a 压缩效果优于zip gzip xff1b 解压速度快 xff1a 在奔腾133上即可达到大约10MB 秒 xff1b 压缩的可执行文件没有额外的内存
  • Prestashop--配置到阿里云

    Prestashop版本 xff1a v1 6 阿里云环境 xff1a 前段时间出来的免费虚拟主机 之前没搞过网站 xff0c 所以这一切都是蛮新鲜的 因为没有接触过 xff0c 所以必然要遇到蛮多的坑 xff0c 将遇到的坑 填好的坑都记
  • 名词解释

    payload http中的payload 有效载荷在一个数据包或者其他传输单元中运载的基本必要数据 xff0c 即加载的基本数据 记载着信息的那部分数据 通常在传输数据中 xff0c 为了使数据传输更可靠 xff0c 要把原始数据分批传输
  • ubuntu和debian_Debian Ubuntu“ netstat:未找到命令”错误解决方案和Netstat安装

    ubuntu和debian Ubuntu is most used Linux distributions Canonical provides enterprise support for Ubuntu desktops and serv
  • ListControl双击实现可编辑

    ON NOTIFY 处理 listControl 消息 列表控件的消息映射同样使用ON NOTIFY宏 xff0c 形式如同 xff1a ON NOTIFY wNotifyCode id memberFxn xff0c wNotifyCod
  • 如何在创业公司工作保持激情?试试这六条建议

    在创业公司里 xff0c 创始人都表现出雄心勃勃的状态 同样 xff0c 他们也希望自己的手下能和他们一样对正在开创的事业充满激情 相比于在成熟的大公司工作 xff0c 创业公司的求职赛场遵循的或许是另一套规则 JasonFreedman是
  • linux pts设备,linux 系统tty、pty和pts 的概念及区别

    基本概念 xff1a 1 tty 终端设备的统称 tty一词源于Teletypes xff0c 或者teletypewriters xff0c 原来指的是电传打字机 xff0c 是通过串行线用打印机键盘通过阅读和发送信息的东西 xff0c
  • sonic——可替代Elasticsearch的简单搜索引擎

    简介 近期 xff0c 笔者在github上发现了一个十分好玩的开源项目 sonic sonic项目的介绍十分简单 Fast lightweight amp schema less search backend An alternative
  • 头文件与源文件中都分别存放哪些东西

    在C代码文件中 xff0c 我们经常会看到两类文件 xff1a 一类是 xff1a 34 h 34 文件 一类是 xff1a 34 c 34 文件 34 h 34 文件 xff0c 就是我们常说的头文件 34 c 34 文件 xff0c 就
  • Radmin远程控制软件

    Radmin远程控制软件 日期 xff1a 2015 08 20 作者 xff1a lujl Radmin是一款快速的远程控制软件 xff0c 可以用来远程管理公司或个人计算机来实现远程办公 你可以通过鼠标和键盘来控制远程的电脑 xff0c
  • barefoot公司和Tofino芯片

    https barefootnetworks com 2005年秋季 xff0c Clean State项目已经在斯坦福成立 xff0c 作为项目主管的Nick Mckeown教授和他的学生Martin Casado xff0c 来自伯克利
  • 合理的布局,绚丽的样式,谈谈Winform程序的界面设计

    从事Winform开发很多年了 xff0c 由于项目的需要 xff0c 设计过各种各样的界面效果 一般来说 xff0c 运用传统的界面控件元素 xff0c 合理设计布局 xff0c 能够设计出比较中规中矩的标准界面 xff1b 利用一些换肤
  • BGP路由协议详解(完整篇)

    原文链接 xff1a http xuanbo blog 51cto com 499334 465596 2010 12 27 12 02 45 上个月我写一篇关于BGP协议的博文 xff0c 曾许诺过要完善这个文档 xff0c 但因最近的工
  • vnc默认端口号_什么是VNC远程桌面连接默认端口号?

    vnc默认端口号 VNC is a protocol used to connect remote systems with GUI It is especially popular in Linux world but supports
  • JAVA通过kerberos认证登陆调起HDFS-进行HDAOOP文件上传下载成功版

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 遇到错误一 xff1a java lang ClassNotFindException org apache commons configuration Configu
  • ZH奶酪:VirtualBox虚拟机与主机ping不通

    6 进入虚拟机的Ubuntu xff08 以下简称VBUbuntu xff09 xff0c 在VBUbuntu中用ifconfig查看ip地址 xff0c 在Windows7中用ipconfig查看ip地址 在VBUbuntu中ping W
  • 为什么类的定义应当写在头文件中,从而被多个源文件包含?

    比如myclass h定义了一个类myclass xff08 只定义类 xff0c 不定义成员函数 xff09 xff0c file1 cpp里 include 34 myclass h 34 xff0c 编译得到file1 obj xff