c++编译器在编译时跳过部分文件吗?
Do c++ compilers skip parts of files when compiling?
在c++中,我听说您需要将实现与接口分开,以减少编译时间。在这个问题中,答案基本上是说,如果你改变头文件,那么源代码将被重新编译,所以如果你将接口从实现中分离出来,那么你需要改变头文件的机会就会减少。下面是我看到的两种情况:
-
将所有代码放在头文件
-
将代码放在单独的头文件和源文件中
由于头文件通常被复制并粘贴(通过include)到源文件中,如果你对头文件或源文件进行了更改,整个文件仍然需要重新编译,因为它们就像一个文件一样。
无论更改头文件还是源文件,整个文件(头文件和源文件)都将被重新编译。
那么将接口与实现分离的优势是什么呢?您可能会说,这样您就可以通过继承的方式为单个接口实现多个实现,但是当您在头文件中拥有所有代码时,您就不能这样做吗?您也可以说这样做是为了使接口看不到任何实现细节,但是这样做有什么用呢?
我能看到为什么将接口与实现分开的唯一原因是,如果c++编译器跳过源文件的部分,即头文件,如果没有更改,则复制并粘贴到源代码中,并且只编译源文件的其余部分。这是真的吗? c++编译器跳过未更改的文件的某些部分的编译吗?我知道可能不是这样,但我想不出任何其他的解释。
编辑
我已经看过这个问题了。我要问的是为什么使用单独的实现和接口文件时的编译时间更快。我知道单独的实现和接口文件有好处,比如Lightness Races in Orbit所说的,但我想问的是为什么编译时间更好如果它们确实如此的话。
您忽略了一个重要的事实:您应该尽量减少对头文件的更改
头文件包含你的接口,它应该尽可能长时间保持不变,以保持你的代码稳定。以后的大部分更改应该在实现文件中,可以单独重新编译。
将接口与实现分离的真正好处是,你的代码/库的用户可以得到一个包含你的头文件的可分发版,允许他们与你的代码接口。他们不需要处理、管理、构建那些庞大得多的实现代码。如果你运行的是Linux,看看你的/usr/include
和/usr/lib
文件夹,你就会明白我说的是什么意思;所有的实现都可以作为编译后的二进制文件发布,这远不那么笨拙(也更难在本地修改)。
如果你把所有的东西都放到一个翻译单元中,那么模拟出单元测试的实现几乎是不可能的。
- 当我使用 osgDB::readNodeFile 时,如何跳过错误的 osgb 文件?
- C++ : 如何在使用 getline() 和 ifstream 对象从文件中读取一行时跳过第一个空格?
- 文件大小和缓冲区过冲
- 如何在 c++ 中跳过读取 csv 文件的第一列
- C :使用getline从文本文件中输入,要么跳过第一行,要么将其余部分弄乱
- 我在让我的代码输出整个链表时遇到问题.它只是输出我修改过的一些文本文件,而不是整个东西
- C++ 输出在读取文本文件时跳过最后一个单词
- 循环在将数据从文件读取到数组C++时跳过行
- fin.ignore()跳过文件中的线
- C /快速随机访问在大文件中跳过
- 如何检查整数是否发生过或在读取C 的输入文件时发生了字符
- 如何在C++中从文本文件中读取时跳过特定的列
- 在读取C 文件时跳过EOF
- 程序不会读过文件中的第一个条目
- 在C++中使用字符串::getline跳过行读取文件
- 从文本文件C++跳过非整数
- C++静态标志使可执行文件过大
- 在Qt中递归浏览目录,跳过文件夹"."并".."
- C++ - 在文件末尾写入并跳过其余部分
- 在 C++ 中将编辑过的内文件保存到输出文件时出现问题