我继承了 C / C ++代码库,并且在许多.cpp文件中,#include
指令包含在#ifndef中,标题内部包含#define
例如
#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
答案 0 :(得分:8)
值得知道的是,某些实现具有#pragma once
和/或header-include-guard检测优化,并且在这两种情况下预处理器将自动跳过打开,读取或处理它已包含的头文件之前。
所以在那些编译器上,包括MSVC和GCC,这种“优化”是没有意义的,并且应该是头文件负责处理多个包含。但是,这可能是#include效率非常低的编译器的优化。该代码在病理上是可移植的,<windows.h>
不是指着名的Win32头文件,而是指某个用户定义的同名头文件吗?
头文件也可能没有多包含防护,并且此检查实际上是必不可少的。在这种情况下,我建议更改标题。标题的整个点可以替代关于该地点的复制和粘贴代码:它不应该包含三行来包含标题。
编辑:
既然你说你只关心MSVC,我会:
#pragma once
。使用预编译的头文件,如果所有这些都会减慢速度。#include
。取决于我是否有更重要的事情需要担心。这是一个经典的周五下午的工作,我不会花费潜在的生产时间; - )
答案 1 :(得分:2)
如果包含文件,则必须读取整个文件,甚至打开/关闭文件的开销可能很大。通过在include
语句周围放置保护指令,它永远不必打开。正如这些问题一样,正确答案是:尝试围绕ifndef
指令取出endif
/ include
警卫并获取秒表......