小编典典

为什么我不应该包含 cpp 文件而使用标头?

all

所以我完成了我的第一个 C++ 编程作业并获得了我的成绩。但是根据评分,我失分了including cpp files instead of compiling and linking them。我不太清楚这意味着什么。

回顾一下我的代码,我选择不为我的类创建头文件,而是在 cpp
文件中做了所有的事情(如果没有头文件,它似乎可以正常工作......)。我猜评分员的意思是我写了’#include“mycppfile.cpp”;’
在我的一些文件中。

我对 cpp 文件的推理#include是: - 应该进入头文件的所有内容都在我的 cpp 文件中,所以我假装它就像一个头文件 - 在 monkey-
see-monkey do fashion 中,我看到了其他头文件#include在文件中,所以我对我的 cpp 文件做了同样的事情。

那么我到底做错了什么,为什么不好呢?


阅读 74

收藏
2022-08-24

共1个答案

小编典典

据我所知,C++
标准不知道头文件和源文件之间的区别。就语言而言,任何具有合法代码的文本文件都与其他文本文件相同。然而,虽然不是非法的,但将源文件包含到您的程序中几乎会消除您从一开始就分离源文件所获得的任何优势。

本质上,#include它的作用是告诉 预处理器 获取您指定的整个文件,并在 编译器
处理它之前将其复制到您的活动文件中。因此,当您将项目中的所有源文件包含在一起时,您所做的基本上没有区别,只是制作一个巨大的源文件而根本没有任何分离。

“哦,这没什么大不了的。如果它运行,那就好了,”
我听到你哭了。从某种意义上说,你是对的。但是现在您正在处理一个很小的小程序,以及一个不错且相对不受阻碍的 CPU 来为您编译它。你不会总是那么幸运。

如果您深入研究过严肃的计算机编程领域,您会看到项目的行数可以达到数百万,而不是数十。那是很多行。如果您尝试在现代台式计算机上编译其中一个,则可能需要几小时而不是几秒钟。

“哦不!这听起来很可怕!但我能阻止这种可怕的命运吗?!”
不幸的是,您对此无能为力。如果编译需要几个小时,那么编译需要几个小时。但这只有第一次才真正重要——一旦你编译过一次,就没有理由再次编译它。

除非你改变什么。

现在,如果您将 200 万行代码合并成一个庞然大物,并且需要做一个简单的错误修复,例如x = y + 1,这意味着您必须再次编译所有 200
万行代码才能对此进行测试。如果你发现你打算做一个x = y - 1代替,那么再一次,两百万行编译在等着你。这是浪费了很多时间,本可以更好地花在做其他事情上。

“但我讨厌没有生产力!如果有某种方法可以单独 编译 我​​的代码库的不同部分,然后以某种方式将它们 链接 在一起!”
一个绝妙的主意,理论上。但是,如果您的程序需要知道不同文件中发生的事情怎么办?除非您想运行一堆微小的 .exe 文件,否则不可能完全分离您的代码库。

“但它肯定是可能的!否则编程听起来像是纯粹的折磨!如果我找到某种方法将 接口与实现
分开怎么办?比如说从这些不同的代码段中获取足够的信息以将它们识别给程序的其余部分,然后放入而是将它们放在某种
文件中?这样,我可以使用#include 预处理器指令 仅引入编译所需的信息!

唔。你可能会在那里做一些事情。让我知道这对你有什么影响。

2022-08-24