问题是要包含一个不必要的标题,以避免在子文件中多次调用它。 在这个场景中,我有几个文件:
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。 现在,为什么这会不好?
请不要说你应该只包含必要的标题来编译,而不是额外的,这还不够解释。
我想在实例中知道为什么这会很糟糕。
如果有人从#include "srlogger.h"
删除srinterface.h
,它会破坏另一个文件,这是一个很弱的解释。包含之后的评论很容易警告其他人。
最让我感兴趣的是,如果它会以一种糟糕的方式影响编译,那么对象或可执行文件的大小是否会因此而改变,是否会影响性能。
或者你有一个很好的解释,为什么这很糟糕。
PS:如果你好奇我为什么要这样做,是因为我正在映射文件之间的依赖关系,做这样的事情我可以在所有依赖关系之间创建图形可视化,使其更容易理解拼图的各个部分如何组合在一起。将子标题传输到更高层次标题中的公共标题会在所有文件之间创建更有条理的结构。答案 0 :(得分:3)
潜在的负面影响是编译时间之一。如果有人包含你不需要标题的标题,那么编译单元的编译时间就会增加。
对于在几秒钟内编译的玩具项目或小型项目(几百个文件),这没有什么不同。 但是,当您处理数百万行代码分布在数十万个文件中的项目时,编译已经花费了相当长的一小时,并且您将一个包含添加到12000个其他文件包含的标题中,因为您可以不要把它明确地添加到实际需要它的120个文件中(但恰好包括公共标题) - 然后你不会受欢迎,因为你只是将每个人的平均构建时间增加了几分钟。
还有风险(在错误的代码库中),你(无意中)拖入其他文件的标题可能会重新定义破坏该源文件的东西,这些东西甚至不需要其他标头。
由于上述原因,我认为标题应仅包含真正需要的内容,并且无法转发声明。实施文件应该仅包含他们真正需要的标题(并包括他们自己的标题首先以确保它们是自包含的。)
希望能回答你的问题。
答案 1 :(得分:1)
“问题是要包含一个不必要的标题,以避免在子文件中多次调用它。”
包含警卫将解决在同一文件中包含多个标头的问题的可行部分。包括警卫将在一定程度上减少不必要的包括。请参阅以下链接:
通过在头文件中添加以下内容来制作包含保护:
//at the very top of the header
#ifndef NAMEOFHEADER_H
#define NAMEOFHEADER_H
// header info
//at the very last line of the header
#endif
这将使您不会在另一个.h或.cpp文件中多次累积相同的头文件。
正如下面的评论中所述,即使每个标头都包含防护装置,您仍然可以获得编译器在其预处理程序指令期间定义的文件甚至不需要的信息。对于跨多个文件的包含链,这必然会发生。