未使用包含C / C ++中的有害物质吗?

时间:2011-10-27 16:35:02

标签: c++

未使用的包含有什么负面影响?

我知道他们会导致二进制大小增加(或者他们?),其他什么?

10 个答案:

答案 0 :(得分:82)

  • 增加编译时间(可能是严重问题)
  • 污染全局命名空间。
  • 预处理程序名称的潜在冲突。
  • 如果第三方库中包含未使用的标头,则可能会将此类库不必要地保留为依赖项。

答案 1 :(得分:29)

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

答案 2 :(得分:21)

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

  1. 视觉污染; 当您尝试计算其他包含您需要的内容时。

  2. 逻辑污染; 它更容易发生功能冲突,编译时间更长(对于几个包含它可能非常小,但如果它成为“策略”如果不清理不需要的包括,它可能会成为一个重大的障碍。)

  3. 依赖性不透明度,因为要分析的标头越多,就越难确定代码中的依赖循环。当您的代码库增长到超出业余爱好者级别的任何重要级别时,了解代码中的依赖项是至关重要的。

答案 3 :(得分:16)

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

  • 任何在标题中声明为外部并在源文件中定义的单例都将包含在您的程序中。这显然增加了内存使用量,并且可能导致一个人更频繁地访问他们的页面文件而导致性能开销(现在不是很大的问题,因为单身人员通常中小型,因为我认识的大多数人都有6 GB以上的RAM。

  • 编制时间增加,对于经常编制的大型商业项目,这可能会导致资金损失。它可能只会增加你的总时间几秒钟,但是将它乘以数百个编译器,或者你可能需要进行测试和调试,这样你就会浪费大量时间,从而导致利润损失。 / p>

  • 您拥有的标头越多,您与程序或其他标头中定义的宏发生预先碰撞的可能性就越大。这可以通过正确使用命名空间来避免,但它仍然是一个很难找到的麻烦。再次失去了利润。

  • 有助于代码膨胀(更长的文件,因此更多的阅读),并可以大大增加您在IDE的自动完成工具中找到的结果数量(有些人虔诚地反对这些工具,但他们确实提高了生产力范围)。

  • 您可能无意中将其他外部库链接到您的程序中。

  • 这样做可能会无意中造成世界末日。

答案 4 :(得分:8)

我认为标题都可以被认为是“真诚的”,也就是说,并不是为了破坏你的代码而精确编写的。

  • 它通常会减慢编译速度(预编译的标题会缓解这一点)

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

  • 宏将污染您的代码(通过使用类似名称空间的名称的宏的前缀来缓解,如BOOST_FOREACH而不是FOREACH)

  • 标头可能暗示指向另一个库的链接。在某些情况下,未使用的标头可能会要求链接器将您的代码与外部库链接(请参阅MSCV的#pragma comment(lib, "") )。我相信一个好的链接器如果没有使用它就不会保留库的引用(IIRC,MSVC的链接器不会保留未使用的库的引用)。

  • 删除的标题是一个较少的意外错误来源。如果您不信任标题(某些编码器比其他编码器更好......),则删除它会消除风险(你不会喜欢在它之后包含一个改变所有内容的结构对齐的标题:生成的错误是......照亮...... )。

  • 标头的static变量声明会污染您的代码。每个静态变量声明都会导致在编译的源中声明一个全局变量。

  • C符号名称将污染您的代码。标题中的声明将污染您的全局或结构命名空间(更可能是两者,因为结构通常是通过类型定义来带来它们的键入全局命名空间)。这可以通过为其符号添加某种“命名空间名称”的库来缓解,例如SDL的SDL_CreateMutex

  • 非命名空间 C ++符号名称将污染您的代码。出于同样的原因。标题错误地使用using namespace语句也是如此。现在,正确的C ++代码将命名其符号。是的,这意味着您通常不应该信任在全局命名空间中声明其符号的C ++标头...

答案 5 :(得分:6)

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

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

答案 6 :(得分:2)

好吧,让他们只有延长编译时间并添加不必要的编译依赖项。

答案 7 :(得分:2)

他们代表笨拙的设计。

如果您不确定要包括哪些内容以及不包括哪些内容,则表明开发人员不知道他在做什么。

仅在需要时才包含包含文件。这可能不是那么大的问题,因为计算机存储器和速度这些天突飞猛进,但它曾经是一次。或者

如果不需要包含,但无论如何包括在内,我建议在它旁边发表评论,说明为什么要包括它。如果新开发人员接触到您的代码,如果您以正确的方式完成,他将非常感谢您。

答案 8 :(得分:0)

include意味着您要添加更多声明。因此,当您编写自己的全局函数时,需要注意该函数已在包含的头中声明。

实施例。如果你编写自己的类auto_ptr {}而不包括“内存”,它将正常工作。但是无论何时你将包含内存,编译器都会给出错误,因为它已经在内存头文件中声明了

答案 9 :(得分:0)

是的,由于外部未使用的变量,它们可以增加二进制大小。

//---- in unused includes ----
extern int /* or a big class */ unused_var;

//---- in third party library ----
int unused_var = 13;