In the C and C++ programming languages, an #include guard, sometimes called a macro guard, header guard or file guard, is a way to avoid the problem of double inclusion when dealing with the include directive.
The C preprocessor processes inclusion directives like #include "foo.h"
to include "foo.h" and transcludes the code of that file into a copy of the main file often called the translation unit.
However, if an #include directive for a given file appears multiple times during compilation, often times constructs are then defined twice, and the resulting translation unit is invalid. #include guards prevent this by defining a preprocessor macro when a header is first included, and detecting its presence to ignore the file's contents next time it is included.
The addition of #include guards to a header file is one way to make that file idempotent and the program safer. Another construct to combat double inclusion is
, which is non-standard but nearly universally supported directive among C and C++ compilers.
The following C code demonstrates a real problem that can arise if #include guards are missing:
Here, the file "child.c" has indirectly included two copies of the text in the header file "grandparent.h". This causes a compilation error, since the structure type foo
will thus be defined twice. In C++, this would be called a violation of the one definition rule.
The same code as the previous section is used with the addition of #include guards. The C preprocessor preprocesses the header files, including and further preprocessing them recursively. This will result in a working source file.
struct foo ;
struct foo ;
Here, the first inclusion of "grandparent.h" has the macro GRANDPARENT_H
defined. When "child.c" includes "grandparent.h" at the second time (while including "parent.h"), as the #ifndef
test returns false, the preprocessor skips down to the #endif
, thus avoiding the second definition of struct foo
. The program compiles correctly.
Different naming conventions for the guard macro may be used by different programmers. Other common forms of the above example include GRANDPARENT_INCLUDED
, CREATORSNAME_YYYYMMDD_HHMMSS
(with the appropriate time information substituted), and names generated from a UUID. (However, names starting with one underscore and a capital letter (C and C++) or any name containing double underscore (C++ only), such as _GRANDPARENT_H
and GRANDPARENT__H
, are reserved to the language implementation and should not be used by the user.[1] [2])
Of course, it is important to avoid duplicating the same include-guard macro name in different header files, as including the 1st will prevent the 2nd from being included, leading to the loss of any declarations, inline definitions, or other #includes in the 2nd header.
For #include guards to work properly, each guard must test and conditionally set a different preprocessor macro. Therefore, a project using #include guards must work out a coherent naming scheme for its include guards, and make sure its scheme doesn't conflict with that of any third-party headers it uses, or with the names of any globally visible macros.
For this reason, most C and C++ implementations provide a non-standard [[pragma once|#pragma once]]
directive. This directive, inserted at the top of a header file, will ensure that the file is included only once. The Objective-C language (which is a superset of C) has an [[Objective-C##import|#import]]
directive, which works exactly like #include
, except that it includes each file only once, thus obviating the need for #include guards.[3]
Some languages support specifying that the code should be included only once, in the including file, rather than in the included one (as with C/C++ include guards and #pragma once
):
%INCLUDE
statement as the equivalent to C's #include
directive. IBM Enterprise PL/I also supports the %XINCLUDE
statement which will "incorporate external text into the source program if it has not previously been included." (It also offers an XPROCEDURE
statement, similar to a PROCEDURE
statement, which will ignore the second and subsequent occurrences of an XPROCEDURE
with the same name.) [4]#import
directive (see above)include_once
[5][[Pragma once | #pragma once]]