未使用的C / C ++中有害吗?
未使用的包括什么负面影响?
我知道他们导致增加二进制大小(或者他们?),还有什么?
- 增加编译时间(潜在的严重问题)
- 污染全局名称空间。
- 预处理器名称的潜在冲突。
- 如果第三方库中包含未使用的头文件,则可能会使这些库不必要地依赖于相关性。
它们不一定会增加二进制大小,但会增加编译时间。
主要问题是混乱 。 这些是杂乱体现的三个主要方面:
-
视觉污染; 而你正在试图找出你需要的其他东西。
-
逻辑污染; 更有可能发生function冲突,有更多的时间进行编译(对于一些内容来说可能确实很小,但是如果它成为不清理不必要内容的“策略”,则可能成为一个重大的障碍)。
-
依赖性不透明; 因为要分析更多的头文件是很难确定代码中的依赖性循环。 当您的代码库增长到超出爱好者水平的任何显着水平时,知道代码中的依赖关系是至关重要的。
一般来说,是的,这确实会造成一些问题。 从逻辑上讲,如果你不需要它,那就不要包含它。
-
在头文件中声明为外部的,在源文件中定义的任何单例都将包含在程序中。 这显然增加了内存使用量,并可能导致更频繁地访问其页面文件(现在不是太大的问题,因为单身人士通常是中小型的,因为大多数我认识的人有6+ GB的RAM)。
-
编译时间增加,对于经常编译的大型商业项目,这可能导致资金损失。 它可能只会增加你的总时间几秒钟,但乘以几百次编译,你可能需要testing和debugging,并且你浪费了很多时间,从而导致利润损失。
-
您拥有的标题越多,您可能与您在程序或其他标题中定义的macros发生冲突的可能性就越高。 这可以通过正确使用名称空间来避免,但是它仍然是一件很麻烦的事情。 再次,失去了利润。
-
有助于代码膨胀(更长的文件,因此更多的阅读),并可以大大增加您在IDE的自动完成工具中find的结果的数量(一些人虔诚地反对这些工具,但它们的确提高了生产力)。
-
您甚至可能无意中将其他外部库链接到您的程序中。
-
这样做可能会不经意间造成世界末日。
我会假设这些标题都可以被认为是“真诚的”,也就是说,并不是为了破坏你的代码而写的。
-
它通常会减慢编译 (预编译的头文件会缓解这一点)
-
它意味着没有真正存在的依赖关系 (这是一个语义错误,而不是一个实际的错误)
-
macros会污染你的代码 (通过名称空间类名称的macros前缀缓解,如在BOOST_FOREACH而不是FOREACH)
-
一个头可能意味着一个链接到另一个库。 在某些情况下,未使用的头文件可能会要求链接程序将您的代码与外部库链接(请参阅MSCV的#pragma comment(lib,“”) )。 我相信一个好的链接器不会保留图书馆的参考,如果它没有被使用(IIRC,MSVC的链接器将不保留一个未使用的图书馆的参考)。
-
一个被删除的标题是一个意想不到的错误的一个来源。 如果你不信任这个头文件(有些编码器比其他编码器更好),那么移除它就会带来一些风险( 你不会希望包含一个头文件来改变所有文件的结构alignment方式:所产生的错误是..照亮… )。
-
一个头文件的
static
variables声明会污染你的代码。 每个静态variables声明都将导致在编译源中声明一个全局variables。 -
C符号名称会污染你的代码。 头文件中的声明将会污染你的全局或结构体的命名空间(更可能的是,这两个结构体通常都是通过typedef来把它们的types放到全局命名空间中的)。 这可以通过图书馆为其符号添加某种“名称空间名称”(如SDL的
SDL_CreateMutex
来SDL_CreateMutex
。 -
非名称空间的 C ++符号名称会污染你的代码。 出于上述相同的原因。 使用
using namespace
语句错误使用的标头也是如此。 现在,正确的C ++代码将命名空间符号。 是的,这意味着你通常不应该相信在全局命名空间中声明其符号的C ++头文件…
他们是否增加二进制大小实际上取决于它们中的内容。
主要的副作用可能是编译速度的负面影响。 再一次,影响有多大取决于其中的内容,多less以及是否包含其他标题。
那么离开他们只会延长编译时间,并增加不必要的编译依赖。
他们代表笨拙的devise。
如果您不确定要包含哪些内容以及不包含哪些内容,则说明开发人员不知道他在做什么。
包含文件仅在需要时才被包含。 计算机内存和速度正在飞速增长,但这也许不是什么大问题。
如果一个包含不需要,但是包含在内,我build议在它旁边添加注释,说明为什么包含它。 如果一个新的开发者join你的代码,他会非常感谢你,如果你做的是正确的。
包括意味着你正在添加更多的声明。 所以当你编写你自己的全局函数的时候,你需要小心,这个函数已经被声明在头文件中了。
防爆。 如果你写自己的类auto_ptr {}不包括“内存”,它会正常工作。 但是无论何时你将包含内存,编译器都会提供错误,因为它已经在内存头文件中声明了
是的,他们可以增加二进制大小,因为外部未使用的variables。
//---- in unused includes ---- extern int /* or a big class */ unused_var; //---- in third party library ---- int unused_var = 13;