gpt4 book ai didi

C++ "extra"头文件

转载 作者:太空狗 更新时间:2023-10-29 20:52:40 25 4
gpt4 key购买 nike

问题是关于包含不必要的 header 以避免在子文件中多次调用它。这是场景,我有几个文件:

srlogger.h

srinterface.h

srinterface.cc
#include <srinterface.h>
#include "srlogger.h"

srbinhttp.h
#include "srinterface.h"

srbinhttp.cc
#include <srbinhttp.h>
#include "srlogger.h"

srsocket.h
#include "srinterface.h"

srsocket.cc
#include <srsocket.h>
#include "srlogger.h"

srhttp.h
#include "srinterface.h"

srhttp.cc
#include <srhttp.h>
#include "srlogger.h"

现在,我要做的是从显示的所有 .cc 文件中删除 #include "srlogger.h",并将其包含到 srinterface.h 文件为:

srinterface.h
#include "srlogger.h"

由于所有 .cc 各自的头文件都包含 srinterface.h,因此 srlogger.h 将被覆盖。现在,为什么这会很糟糕?

请不要说你应该只包含编译所需的头文件而没有额外的东西,这还不够解释。

我想知道为什么这会很糟糕。

哦,如果有人从 srinterface.h 中删除了 #include "srlogger.h",它会破坏其他文件,这是一个薄弱的解释。包含之后的评论可以很容易地警告其他人。

我最感兴趣的是它是否会以不好的方式影响编译,对象或可执行文件的大小是否会因此而改变,是否会影响性能。

或者你有一个很好的解释为什么这是不好的。

PS.: 如果你好奇我为什么要这样做,因为我在映射文件之间的依赖关系,做这样的事情我可以在所有依赖关系之间创建一个图形可视化,使其更容易理解拼图的各个部分如何组合在一起。将子标题转移到更高层次标题中的公共(public)标题会在所有文件之间创建更有条理的结构。

最佳答案

潜在的负面影响之一是编译时间。如果有人包含您的 header 但不需要它拖入的 header ,则该编译单元的编译时间将无缘无故地增加。

对于在几秒钟内编译的玩具项目或小型项目(几百个文件),这没有什么真正的区别。但是,当您处理的项目包含分布在数十万个文件中的数百万行代码时,编译已经花费了相当多的时间,并且您将包含添加到 12000 个其他文件包含的 header 中,因为您可以不要费心将它显式添加到实际需要它的 120 个文件中(但恰好包含公共(public) header )——那么你不会受欢迎,因为你只是将每个人的平均构建时间增加了几分钟。

还有一个风险(在糟糕的代码库中),即您(不必要地)拖入其他文件的 header 可能会重新定义一些东西,这些东西会破坏该源文件的内容,而该源文件一开始甚至不需要其他 header 。

由于上述原因,认为 header 应该只包含他们真正自己需要的内容,不能转发声明。实现文件应包含它们真正需要的 header (并首先包含它们自己的 header 以确保它们是自包含的)。

希望这能回答您的问题。

关于C++ "extra"头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45600415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com