include guard and #pragma once
wikipedia include guard
In the C and C++ programming languages, an #include guard, sometimes called a macro guard, header guard or file guard, is a particular construct used to avoid the problem of double inclusion when dealing with the include directive.
The addition of #include
guards to a header file is one way to make that file idempotent. Another construct to combat(反对) double inclusion is #pragma once, which is non-standard but nearly universally supported among C and C++ compilers.
wikipedia pragma once
In the C and C++ programming languages, **pragma once**
is a non-standard but widely supported preprocessor directive designed to cause the current source file to be included only once in a single compilation.[1] Thus, #pragma once
serves the same purpose as include guards, but with several advantages, including: less code, avoidance of name clashes, and sometimes improvement in compilation speed.[2] On the other hand, #pragma once
is not necessarily available in all compilers and its implementation is tricky and might not always be reliable.
stackoverflow Is #pragma once a safe include guard?
#pragma once
#ifndef HEADER_H
#define HEADER_H
...
#endif // HEADER_H
#pragma once
does have one drawback (other than being non-standard) and that is if you have the same file in different locations (we have this because our build system copies files around) then the compiler will think these are different files.
Using #pragma once
should work on any modern compiler, but I don't see any reason not to use a standard #ifndef
include guard. It works just fine. The one caveat is that GCC didn't support #pragma once
before version 3.4.
I also found that, at least on GCC, it recognizes the standard #ifndef
include guard and optimizes it, so it shouldn't be much slower than #pragma once
.