c++编译器在编译时跳过部分文件吗?

Do c++ compilers skip parts of files when compiling?

本文关键字:文件 过部 编译器 编译 c++      更新时间:2023-10-16

在c++中,我听说您需要将实现与接口分开,以减少编译时间。在这个问题中,答案基本上是说,如果你改变头文件,那么源代码将被重新编译,所以如果你将接口从实现中分离出来,那么你需要改变头文件的机会就会减少。下面是我看到的两种情况:

  1. 将所有代码放在头文件

  2. 将代码放在单独的头文件和源文件中

    由于头文件通常被复制并粘贴(通过include)到源文件中,如果你对头文件或源文件进行了更改,整个文件仍然需要重新编译,因为它们就像一个文件一样。

    无论更改头文件还是源文件,整个文件(头文件和源文件)都将被重新编译。

那么将接口与实现分离的优势是什么呢?您可能会说,这样您就可以通过继承的方式为单个接口实现多个实现,但是当您在头文件中拥有所有代码时,您就不能这样做吗?您也可以说这样做是为了使接口看不到任何实现细节,但是这样做有什么用呢?

我能看到为什么将接口与实现分开的唯一原因是,如果c++编译器跳过源文件的部分,即头文件,如果没有更改,则复制并粘贴到源代码中,并且只编译源文件的其余部分。这是真的吗? c++编译器跳过未更改的文件的某些部分的编译吗?我知道可能不是这样,但我想不出任何其他的解释。

编辑

我已经看过这个问题了。我要问的是为什么使用单独的实现和接口文件时的编译时间更快。我知道单独的实现和接口文件有好处,比如Lightness Races in Orbit所说的,但我想问的是为什么编译时间更好如果它们确实如此的话。

您忽略了一个重要的事实:您应该尽量减少对头文件的更改

头文件包含你的接口,它应该尽可能长时间保持不变,以保持你的代码稳定。以后的大部分更改应该在实现文件中,可以单独重新编译。

将接口与实现分离的真正好处是,你的代码/库的用户可以得到一个包含你的头文件的可分发版,允许他们与你的代码接口。他们不需要处理、管理、构建那些庞大得多的实现代码。如果你运行的是Linux,看看你的/usr/include/usr/lib文件夹,你就会明白我说的是什么意思;所有的实现都可以作为编译后的二进制文件发布,这远不那么笨拙(也更难在本地修改)。

坦率地说,这对我来说似乎是常识。当你购买产品时,你收到的是说明书,而不是生产步骤。

如果你把所有的东西都放到一个翻译单元中,那么模拟出单元测试的实现几乎是不可能的。