gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:13:05 24 4
gpt4 key购买 nike

我看到有人问过类似的问题,但它们对我的猿类大脑仍然没有意义。

这是一个例子。如果我在名为 Bob.h 的头文件中声明了一个函数: void PrintSomething();.cpp我说的文件:void MyClass::PrintSomething(){std::cout << "Hello";} .我在另一个.cpp见过人文件例如 Frank.cpp , 仅包括 Bob.h仅包含声明(其中没有代码)而不是 .cpp 的 header 使用代码,但让我大吃一惊的是当他们调用 PrintSomething() Frank.cpp中的函数它使用 Bob.cpp 中的代码并打印“你好”。如何?它如何打印在 .cpp 中添加的“Hello”当我只包含 .h 时的文件没有说“你好”的文件,它只是一个声明?我也查看了编译过程和链接过程,但它就是不坚持。

如果我现在在我的 Frank.cpp 中说的话,最重要的是文件:void MyClass::PrintSomething(){std::cout << "Bye";}并包括Bob.h我的 main.cpp 中的文件并调用PrintSomething()函数会打印“Hello”还是“Bye”?是计算机通灵还是什么?这个概念是我在 C++ 学习过程中没有掌握的一件事。

提前致谢。

最佳答案

你加入的那一刻Bob.h编译器拥有它需要知道的关于 PrintSomething() 的所有信息,它只需要一个函数的声明。 Frank.cpp不需要知道Bob.cpp它定义了 PrintSomething() .

您的所有个人cpp files 输出编译器生成的目标文件。在将它们全部粘合在一起之前,它们本身并没有多大作用,这是链接器的责任。

链接器获取所有目标文件并填写缺失的部分:

链接者谈话:

Hey, I see that Frank.obj uses PrintSomething() and I can't seeits definition in that object file.

Let's check the other object files..

Upon inspecting Bob.obj I can see that this contains a usabledefinition for PrintSomething(), let's use that.

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

完成此操作后,您将获得可用的可执行文件。


on top of which if I were to now say in my Frank.cpp file: void MyClass::PrintSomething(){std::cout << "Bye";} and included the Bob.hfile in my main.cpp and called the PrintSomething() function would itprint "Hello" or "Bye"? Is the computer psychic or something?

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

关于c++ - 为什么我们包含头文件而不包含源文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66675925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com