首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ #include -仅部分包含#include

C++ #include -仅部分包含#include
EN

Stack Overflow用户
提问于 2012-07-10 04:14:23
回答 4查看 9.6K关注 0票数 4

有时我会遇到这样的情况,我发现我需要在大型的第三方文件中添加一个#include,这样我就可以使用一个函数或一个小类,这让我感到内疚,因为我知道这已经不存在了,所以增加了我的编译时间,因为当我只想要一个函数时,它会编译整个文件。有没有办法绕过这一点,只包含我想要的一个函数,而不重写整个函数?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-10 04:27:22

您有一些选项:

  • 只包含报头。真的,它不会增加你的编译时间。
  • 会向你的第三方头文件提供商投诉。告诉他们发布更小、更模块化的报头。
  • 不包含报头,而是将您关心的单个函数声明为extern,如so extern int GetMeaningOfLife(int mice);
票数 10
EN

Stack Overflow用户

发布于 2012-07-10 04:22:09

你不能只编译头部的一部分。如果第三方有他们的头拉了很多代码,你对此无能为力。我能想到的最好的解决方案是使用precompiled headers,这应该会消除一些编译开销,因为这些头文件只会完全编译一次。另一种选择是使用类的正向声明,而不是包括它们的声明,如果其他转换单元确实包含头部的话。不过,这只能让您将这些类用作指针。

票数 4
EN

Stack Overflow用户

发布于 2012-07-10 04:30:14

有时,简单地编写您自己的转发声明而不是包含报头可能是合理的。不过,如果你不负责定义东西,那么你可能会遇到定义改变的问题,你必须更新你的转发声明。

例如,一些Boost库试图在标准库中向前声明一些东西,以避免#includes。最近,他们遇到了标准库的libc++实现的问题,因为libc++使用内联名称空间,所以简单的转发声明不适用于libc++。事实上,标准库实现可以做许多符合标准的不同事情,但可能会破坏适用于不同实现的向前声明。

因此,手动转发声明是脆弱的,可能是不可移植的,但可能对您有效。

另一种选择是使用预编译头。这可以减少包含报头所需的处理。例如,我有一个scratch项目,其中包含来自标准库的每个头文件。如果没有预编译头,编译一个空程序需要几秒钟的时间。使用预编译头,一个空程序只需要几分之一秒。

你必须看看你的编译器是如何处理预编译头的。例如,在使用-x c++头文件或-x c头文件处理头文件时,Gcc和clang会生成预编译头文件。然后,当您使用-include标志来包含一个文件时,编译器将搜索该头文件的预编译版本(使用编译器特定的命名约定),并可能将其包含在内。

$ cat everything.h

#include

$ cat main.cpp

int main() { std::cout <<“您好,世界!\n”;}

$ clang++ -x c++-标头所有内容.h -o everything.h.pch

$ clang++ main.cpp -include everything.h

$ ./a.out

你好,世界

当.pch寻找.gch时,Clang寻找的是Clang

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11402394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档