有时我会遇到这样的情况,我发现我需要对大型第三方文件进行#include,这样我才能使用一个函数或一个小类,这让我感到内疚,因为我知道这已经消失了编译时,因为当我只想要一个函数时它将编译整个文件。有没有办法解决这个问题,只包括我想要的那个函数而不重写整个东西?
答案 0 :(得分:10)
你有一些选择:
extern
声明为您关注的单个函数,例如extern int GetMeaningOfLife(int mice);
答案 1 :(得分:4)
您无法仅编译标题的一部分。如果第三方有他们的标题拉了很多代码,那么你无能为力。我能想到的最好的解决方案是使用precompiled headers,它应该消除一些编译开销,因为这些头只能完全编译一次。如果某些其他翻译单元确实包含标题,则另一种选择是使用类的前向声明而不是包括它们的声明。但这只会让你使用这些类作为指针。
答案 2 :(得分:2)
有时简单地编写自己的前向声明而不是包含标题可能是合理的。虽然如果您不负责定义该事物,那么您可能遇到定义更改的问题,并且您必须更新前向声明。
例如,一些Boost库试图在标准库中转发声明一些内容以避免#includes。最近他们遇到了标准库的libc ++实现的问题,因为libc ++使用内联命名空间,因此天真的前向声明不适用于libc ++。实际上,标准库实现可以执行许多符合标准的不同内容,但可以突破适用于不同实现的声明。
因此,手动前向声明很脆弱,可能不可移植,但可能适合您。
另一种选择是使用预编译头。这可以减少包括标题所需的处理。例如,我有一个临时项目,我在其中包含标准库中的每个标题。没有预编译的头编译空程序需要几秒钟。使用预编译的头文件,空程序只需要一小段时间。
您必须查看编译器如何处理预编译的头文件。例如,当您使用-x c ++ - header或-x c-header处理头文件时,Gcc和clang会生成预编译头。然后,当您使用-include标志包含文件时,编译器将搜索该标头的预编译版本(使用编译器特定的命名约定),并且可以包含该文件。
$ cat everything.h
#include <iostream>
$ cat main.cpp
int main() { std::cout << "Hello, World!\n"; }
$ clang ++ -x c ++ - header everything.h -o everything.h.pch
$ clang ++ main.cpp -includes everything.h
$ ./ a.out
你好,世界
当gcc寻找.gch
时,Clang会寻找.pch答案 3 :(得分:1)
标题可能不会增加您的编译时间。这取决于它的内容。编辑你不需要的东西当然是可能的,但我不推荐它。这很容易出错,并且通常需要很少的努力来获得很少的回报。标题是否有include guards?如果没有,如果编译速度慢,可以考虑添加它们。