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

时间:2015-09-12 15:05:55

标签: c++ c header-files

在C ++中,我听说你需要将实现与接口分开,以减少编译时间。在this问题中,回答者基本上说如果更改标题然后重新编译源代码,那么如果将接口与实现分开,那么您需要更改标题的可能性就会降低。但这是我看到的两种情景:

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

    每当您更改任何代码时,都会重新编译整个文件。

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

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

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

  3. 那么将接口与实现分离的优势是什么?您可能会说通过继承可以为单个接口实现多个实现,但是当您在头文件中包含所有代码时,您仍然可以这样做吗?您还可以说接口没有看到任何实现细节,但有什么用呢?

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

    修改

    我已经看过this个问题了。我要问的是为什么使用单独的实现和接口文件,编译时间更快。我知道单独的实现和接口文件有很多优点,例如Orbit中的Lightness Races所说的,但我要问的是为什么编译时间更好如果它们完全可以。

1 个答案:

答案 0 :(得分:2)

你遗漏了一个重要的事实:你应该尽量减少对头文件的更改

标题包含您的界面,该界面应尽可能保持不变,以保持代码稳定。您前进的大多数更改应该在实现文件中,可以单独重新编译。

将接口与实现分离的真正好处是,可以为您的代码/库的用户提供包含头文件的distributable,从而允许他们与您的代码进行交互。他们不需要处理,管理,构建等更笨重的实现代码。如果您正在运行Linux,请查看您的/usr/include/usr/lib文件夹,并且您将看到我的意思 - 所有实现都可以作为已编译的二进制文件发送,这样做不那么笨重(并且更难以就地修改。

坦率地说,这对我来说似乎是常识。当您购买产品时,您会收到一本说明手册,而不是制作它的步骤。

如果将所有内容整合到一个翻译单元中,那么单独测试的实现也几乎是不可能的。 C编译模型根本就不是为此而设计的。