提问者:小点点

C++:是否可以在每个项目中只包含一次头?


除了更简单的语法外,Go声称它只需导入一次依赖项,就能在很大程度上实现它的快速编译速度:

Go为所有文件导入依赖项一次,因此导入时间不会随项目大小呈指数增长。

如果你仔细设计,用C++能完成同样的事情吗?

例如,将所有包含添加到包含在所有文件中的单个包含文件(只使用一次pragma)? 或者,如果对任何头的任何更改都将重新编译所有内容,而不是增量编译,那么它会大大减慢它的速度吗?

我用的是LLVM。 还在设计项目。


共2个答案

匿名用户

通常一个项目由许多。cpp文件组成。 包含所有内容的。cpp文件是一个翻译单元(TU)。 它们分别编译,然后链接到可执行文件或DLL中。

您的解决方案将强制每个TU(不管其依赖关系有多小)都包含巨大的头文件。 它将被包含一次,但对项目中的每个。cpp文件都包含一次。

最有可能的是,它会使编译变得更慢。 更不用说这样的体系结构的所有问题了--维护这个代码库的健全将是痛苦的。

在您的问题中有一个洞察力--可能您想要的是预编译的头。 在某些情况下仔细使用它们可以缩短编译时间。

匿名用户

是的,通过仔细管理代码结构,在C++中大大减少构建时间是可能的。

实现这一点的一种方法是广泛使用前向声明。 有一个工具可以帮助实现这一点:包括你所使用的内容。

为了使其更有效,您还必须防止编译器在头文件中生成构造函数,析构函数和赋值运算符的默认实现。 因此,在头文件中声明它们,然后在各自的cpp中默认定义它们,可以帮助保持在头文件中声明的某些类向前。

加快构建时间的另一种方法是广泛使用依赖反转。 但这是任何语言的通则。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|项|目中|包含|头)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?