Include guards, as defined here, are used to prevent loading the same code twice at compilation.
Why can't my compiler (GCC) detect that it is loading the same code twice and have a sensible default behaviour?
Simply because you might have wanted the compiler to load that file twice.
Remember, that #include
simply loads a file and puts its contents in the place of the directive. This file might be a header file, but may be useful and frequently used piece of source code as well.
Most modern compilers react to #pragma once
doing exactly what you want them to. Remember though, that this is a compiler extension not included in the language specification and it is generally a good idea to stick to include guards - you'll be certain, that it works on every compiler and in any circumstances.