C++ 未使用的包括C/C和#x2B中的有害物质+;?

C++ 未使用的包括C/C和#x2B中的有害物质+;?,c++,C++,未使用的包括哪些负面后果 我知道它们会导致二进制大小增加(或者它们会增加吗?),还有什么吗?它们不一定会增加二进制大小,但会增加编译时间。它们是否会增加二进制大小实际上取决于它们中的内容 主要的副作用可能是对编译速度的负面影响。同样,影响有多大取决于其中包含的内容、数量以及是否包含其他标题。 增加编译时间(潜在的严重问题) 污染全局命名空间 预处理器名称的潜在冲突 如果第三方库中包含未使用的头,则可能会使这些库不必要地作为依赖项进行维护 好吧,只需将它们留在那里就可以延长编译时间并添加不必要的编

未使用的包括哪些负面后果


我知道它们会导致二进制大小增加(或者它们会增加吗?),还有什么吗?

它们不一定会增加二进制大小,但会增加编译时间。

它们是否会增加二进制大小实际上取决于它们中的内容

主要的副作用可能是对编译速度的负面影响。同样,影响有多大取决于其中包含的内容、数量以及是否包含其他标题。

  • 增加编译时间(潜在的严重问题)
  • 污染全局命名空间
  • 预处理器名称的潜在冲突
  • 如果第三方库中包含未使用的头,则可能会使这些库不必要地作为依赖项进行维护

好吧,只需将它们留在那里就可以延长编译时间并添加不必要的编译依赖项

主要问题是杂乱无章。这些是混乱表现的三个主要方面:

  • 视觉污染当您试图找出您确实需要的其他包含项时

  • 逻辑污染它更有可能发生函数冲突,需要更多的编译时间(对于几个包含来说可能真的很小,但如果它成为不清理不需要的包含的“策略”,它可能会成为一个重大障碍)

  • 依赖性不透明度由于要分析的标题较多,因此很难确定代码中的依赖循环。当您的代码库增长到超出爱好者级别的任何重要级别时,了解代码中的依赖项是至关重要的


  • 它们代表了笨拙的设计。

    如果您不确定要包含什么和不包含什么,则表明开发人员不知道自己在做什么

    包含文件意味着仅在需要时才包含。随着计算机内存和速度的飞速增长,这可能不是什么大问题,但也许曾经是


    如果不需要包含,但无论如何都要包含,我建议在它旁边放一条评论,说明为什么要包含它。如果一个新的开发人员理解了你的代码,他会非常感激你,如果你做得对的话。

    一般来说,是的,它确实会引起一些问题。从逻辑上讲,如果你不需要它,那么就不要包含它

    • 在头文件中声明为外部并在源文件中定义的任何单例都将包含在程序中。这显然会增加内存使用,并可能导致访问页面文件的次数增加,从而增加性能开销(现在这不是什么大问题,因为单例通常是中小型的,而且我认识的大多数人都有6+GB的RAM)

    • 编译时间会增加,对于经常编译的大型商业项目,这可能会造成金钱损失。这可能只会给你的总时间增加几秒钟,但乘以几百次编译,你可能需要进行测试和调试,这会造成巨大的时间浪费,从而导致利润损失

    • 标题越多,与程序中定义的宏或其他标题发生预加载冲突的可能性就越高。这可以通过正确使用名称空间来避免,但要找到它仍然很麻烦。再次,利润损失

    • 有助于代码膨胀(更长的文件,因此更易于阅读),并能极大地增加IDE自动完成工具中的结果数量(有些人坚决反对这些工具,但它们确实在一定程度上提高了工作效率)

    • 您可能会在不知情的情况下意外地将其他外部库链接到您的程序中

    • 你这样做可能会无意中导致世界末日


    包含意味着您要添加更多声明。因此,当您编写自己的全局函数时,您需要小心该函数是否已在包含的标题中声明


    如果您编写自己的类auto_ptr{}而不包含“memory”,那么它可以正常工作。但无论何时包含内存,编译器都会给出错误,因为它已经在内存头文件中声明了

    我假设这些头文件都可以被认为是“真诚的”,也就是说,这些头文件的编写并不是为了破坏代码

    • 这通常会减慢编译速度(预编译的头文件将缓解这一点)

    • 它意味着没有真正存在的依赖关系(这是语义错误,而不是实际错误)

    • 宏将污染您的代码(通过在宏前面加上类似名称空间的名称来减轻污染,如在中而不是在FOREACH中)

    • 标题可能意味着指向另一个库的链接。在某些情况下,未使用的头可能会要求链接器将代码链接到外部库(请参阅MSCV)。我相信一个好的链接器不会保留库的引用,如果它没有被使用(IIRC,MSVC的链接器不会保留未使用库的引用)

    • 删除的标头会减少意外错误的来源。如果您不信任头(一些编码人员比其他人好…),那么删除它会消除风险(您不希望包含头更改后面所有内容的结构对齐方式:生成的错误…很明显…)

    • 标题的
      静态
      变量声明将污染代码。每个静态变量声明将导致在编译的源代码中声明一个全局变量

    • C符号名称将污染您的代码。标头中的声明将污染全局或结构命名空间(更可能的是,两者都会污染,因为结构通常被类型化以将其类型带入全局命名空间)。
      //---- in unused includes ----
      extern int /* or a big class */ unused_var;
      
      //---- in third party library ----
      int unused_var = 13;