2009-06-20 63 views
4

我继承了C/C++代码库,并且在许多.cpp文件中,#include指令被封装在#ifndef的头部内部单个包括#define中。在#ifndef's中包含#包含 - 是否添加任何值?

例如

#ifndef _INC_WINDOWS 
#include <windows.h> 
#endif 

和WINDOWS.H看起来像

#ifndef _INC_WINDOWS 
#define _INC_WINDOWS 
...header file stuff.... 
#endif // _INC_WINDOWS 

我认为这样做是为了加快代码的编译/预处理。

我认为这是丑陋的和过早的优化,但由于项目有5分钟的清理时间,我不想让事情变得更糟。

那么这种做法是否会增加任何价值或加快速度?清理它们可以吗?

更新:编译器是MSVC(VS2005)和平台的Win32/WinCE的

回答

8

值得知道一些实现有#pragma once和/或一个头,包括 - 保护检测优化,并且在这两种情况下,预处理器都会自动跳过打开,读取或处理之前包含的头文件。

所以在这些编译器上,包括MSVC和GCC,这个“优化”是没有意义的,它应该是头文件处理多重包含的责任。但是,这可能是对#include效率非常低的编译器的优化。代码在病态上是否可移植,并且<windows.h>不是指着名的Win32头文件,而是指某个用户定义的同名头文件?

头文件也可能没有多重保护,而且这种检查实际上是必不可少的。在这种情况下,我会建议更改标题。标题的全部内容代替了关于该地点的复制和粘贴代码:它不应该包含三行来包含标题。

编辑:

既然你说你只关心MSVC,我要么:

  • 做大规模修改,时间构建公正,以确保前面的程序员不知道我的东西别。如果有帮助,可以加#pragma once。如果所有这些都会减慢速度,请使用预编译头文件。
  • 忽略它,但不要使用新的文件的警卫或添加到旧文件的新的#include

根据我是否有更重要的事情需要担心。这是一个典型的星期五下午的工作,我不会花费潜在的生产时间;-)

2

如果包括文件,那么整个文件已经被读取,开放的,甚至架空/关闭该文件可能是显著。通过将防范指令放在include声明中,它永远不必打开。与往常一样带着这些问题,正确的答案是:尽量取出围绕include指令的ifndef/endif卫士,让您的秒表......

+0

所以这就是我的问题的胆量,有其他人在现代代码基础上计时,工具集。 – 2009-06-20 10:20:35

+1

我知道一个C++代码库,这样做会花费几分钟的时间(总构建时间,两个小时)。但切换预编译头文件的差异更大。而“现代”可能并不意味着这里有用!每个C++项目的构建系统可能略有不同,几乎都基于石器时代的概念。没有任何“现代”的开发系统使用户对这种活动感到困扰。 – 2009-06-20 10:24:11