C ++ #include - 只有部分#include

时间:2012-07-09 20:14:23

标签: c++ include

有时我会遇到这样的情况,我发现我需要对大型第三方文件进行#include,这样我才能使用一个函数或一个小类,这让我感到内疚,因为我知道这已经消失了编译时,因为当我只想要一个函数时它将编译整个文件。有没有办法解决这个问题,只包括我想要的那个函数而不重写整个东西?

4 个答案:

答案 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?如果没有,如果编译速度慢,可以考虑添加它们。