We all know when to use include guard, but when shall we not use it in our project?
Recently, I saw a project with mix compilation (CUDA + GCC), one header file (CUDA file) is deliberately left without include guard. I am just curious about it.
There are 2 scenarios off the top of my head:
assert.h works)In our projects we never use include guard. We are using include antiguard:
#ifndef _stdafx_h_ #define _stdafx_h_ #else #error reinclude stdafx.h #endif Because if you reincluded same header - you written wrong code or worked with wrong architecture.
#include <vector> in two different files in your projects?<vector>, even if I'm also including my "algorithms.h" file that also includes <vector> for some reason. Some style guides, as Google's one, suggest you include all the headers of the data types you use.One case in when you do want to include the same file several times with different parameters. In this case the include file would act as a sort of template. An example are the scalers on Dosbox.
Include guards are used so that the include file can be included multiple times in a single compilation unit without resulting in duplicate declarations.
Do not use include guards when the file should be included multiple times in a single compilation unit and this does not result in duplicate declarations.
x_orxx_in some conventions); see also here. Boost.Preprocessor shows how to take this to the extreme.