I have inherited C/C++ code base, and in a number of .cpp files the #include
directives are wrapped in #ifndef\'s with the headers internal sin
If a file is included, then that whole file has to be read, and even the overhead of opening/closing the file might be significant. By putting the guarding directives around the include
statement, it never has to be opened. As always with these questions, the correct answer is: try taking out the ifndef
/endif
guards around the include
directives and get your stopwatch...
It's worth knowing that some implementations have #pragma once
and/or a header-include-guard detection optimisation, and that in both cases the preprocessor will automatically skip opening, reading, or processing a header file which it has included before.
So on those compilers, including MSVC and GCC, this "optimisation" is pointless, and it should be the header files responsibility to handle multiple inclusion. However, it's possible that this is an optimisation for compilers where #include is very inefficient. Is the code pathologically portable, and <windows.h>
refers not to the well-known Win32 header file, but to some user-defined header file of the same name?
It's also possible that the header files don't have multiple-include guards, and that this check is actually essential. In which case I'd suggest changing the headers. The whole point of headers is as a substitute for copy-and-pasting code about the place: it shouldn't take three lines to include a header.
Edit:
Since you say you only care about MSVC, I would either:
#pragma once
if it helps. Use precompiled headers if all this really is slowing things down.#include
s added to old files.Depending on whether I had more important things to worry about. This is a classic Friday-afternoon job, I wouldn't spend potentially-productive time on it ;-)