The following post is actually a repost from StackOverflow. The answer of the question is scattered in so many places, it’s really hard to get a proper answer. This is my respect to the person who posted the answer (however, was not selected to be the best answer, sadly).
There seems to be a lot of confusion regarding the preprocessor.
What the compiler does when it sees a
#includethat it replaces that line with the contents of the included files, no questions asked.
So if you have a file
a.hwith this contents:
typedef int my_number;
and a file
b.cwith this content:
#include "a.h" #include "a.h"
b.cwill be translated by the preprocessor before compilation to
typedef int my_number; typedef int my_number;
which will result in a compiler error, since the type
my_numberis defined twice. Even though the definition is the same this is not allowed by the C language.
Since a header often is used in more than one place include guards usually are used in C. This looks like this:
#ifndef _a_h_included_ #define _a_h_included_ typedef int my_number; #endif
b.cstill would have the whole contents of the header in it twice after being preprocessed. But the second instance would be ignored since the macro
_a_h_included_would already have been defined.
This works really well, but has two drawbacks. First of all the include guards have to be written, and the macro name has to be different in every header. And secondly the compiler has still to look for the header file and read it as often as it is included.
Objective-C has the
#importpreprocessor instruction (it also can be used for C and C++ code with some compilers and options). This does almost the same as
#include, but it also notes internally which file has already been included. The
#importline is only replaced by the contents of the named file for the first time it is encountered. Every time after that it is just ignored.