当前位置: 首页 > 知识库问答 >
问题:

为什么我们包含头文件而不包含源文件?

孙凌龙
2023-03-14

我见过类似的问题,但他们仍然没有意义,我的猿类大脑。

这里有一个例子。如果我在名为bob.h的头文件中声明了一个函数:void PrintSomething();并且在.cpp文件中声明了一个函数:void myclass::PrintSomething(){std::cout<<“hello”;}。我在另一个.cpp文件(例如frank.cpp)中看到过这样的人,它只包含bob.h头,它只有声明(里面没有代码),而不包含带有代码的.cpp。但令我震惊的是,当他们调用frank.cpp中的printSomething()函数时,它使用了bob.cpp中的代码并打印“hello”。怎么做?当我只包含了.h文件时,它如何打印在.cpp文件中添加的“hello”,而它只是一个声明,它对“hello”只字不提?我也看过编译过程和链接过程,但它就是不坚持。

如果我现在在我的frank.cpp文件中说:void myclass::printsomething(){std::cout<<“bye”;}并在我的main.cpp中包含bob.h文件,并调用printsomething()函数,那么它会打印“hello”或“bye”吗?电脑是灵媒还是什么?这个概念是我在C++学习过程中没有掌握的一件事。

提前道谢。

共有1个答案

公羊兴文
2023-03-14

当您包含bob.h时,编译器就拥有了它需要知道的关于printSomething()的一切,它只需要函数的声明。frank.cpp不需要了解定义printSomething()bob.cpp

所有单独的cpp文件都输出编译器生成的对象文件。在它们被粘在一起之前,它们本身并没有什么作用,这是连接者的责任。

链接器将获取所有对象文件并填充缺少的部分:

链接器对话:

嘿,我看到frank.obj使用了printSomething(),而我在该对象文件中看不到它的定义。

让我们检查其他对象文件。

在检查bob.obj时,我可以看到它包含了printSomething()的可用定义,让我们使用它。

这当然是简化的,但简而言之,这就是链接器的作用。

完成这些之后,您就得到了可用的可执行文件。

如果我现在在frank.cpp文件中说:void myclass::printsomething(){std::cout<<“bye”;}并在我的main.cpp中包含bob.h文件,并调用printsomething()函数,那么它会打印“hello”或“bye”吗?电脑是灵媒还是什么?

链接器会找到printsomething()的两个定义,并会发出一个错误,它无法知道哪个定义是要选择的正确定义。

 类似资料:
  • 我正在编写一个小的Java库,其中包含我通常在大多数android应用程序中包含的相关代码。我决定将库导出为一个jar文件,然后将该文件放到我未来项目的libs文件夹中。 null 现在,当我在我的一个android应用程序中使用这个jar时,除了Doc部分之外,所有的一切都像预期的那样运行。当我悬停在我的库的类和方法上时,我看不到我编写的文档注释。 Q1:我是不是又少了一步? Q2:jar文件应

  • 我想创建一个模型jar文件,但不包括源代码。可能吗?默认情况下,Repast模型安装程序包含源代码,但我想对模型的接收者隐藏它。

  • SSI 指令为用户提供在 Web 服务器处理之前将一个文件的内容插入到另一个文件的方法。ASP 只使用这一机制的 #include 指令。要在 .asp 文件中插入一个文件,使用下面的语法: <!--#include virtual | file ="filename"--> virtual 和 file 关键字指示用来包含该文件的路径的类型,filename 是您想包含的文件的路径和名称。 被包

  • 文件包含 可以使用source和.关键字,如: source ./function.sh . ./function.sh 在bash里,source和.是等效的,他们都是读入function.sh的内容并执行其内容(类似PHP里的include),为了更好的可移植性,推荐使用第二种写法。 包含一个文件和执行一个文件一样,也要写这个文件的路径,不能光写文件名,比如上述例子中: . ./functio

  • include 标签是模板开发中最最常用的标签之一,它可以在模板中包含其它模板的内容;用法如下: <include file='模版1,模版2,...' /> 请不要在include 的模板文件中使用模板布局或者模板继承 file 属性的定义规则: 以前台simlpeboot3主题为例: 控制器/操作 <include file="public/header" /> <!-- 以上表示包含当前

  • tc_include tc_include是前台模板包含文件的方法,用于替换原来的include的标签,实现更多功能 用法: <tc_include file="Public:nav"/> <!--加载的是当前模板的Public/nav.html--> <tc_include file="Public/nav"/> <!--加载的是当前模板的Public/nav.html--> <tc_inclu