As others have said, for standard library headers, the system must ensure that the effect of a header being included more than once is the same as the header being included once (they must be idempotent).  An exception to that rule is assert.h, the effect of which can change depending upon whether NDEBUG is defined or not.  To quote the C standard:
Standard headers may be included in any order; each may be included more than once in
  a given scope, with no effect different from being included only once, except that the
  effect of including <assert.h> depends on the definition of NDEBUG.
How this is done depends upon the compiler/library.  A compiler system may know the names of all the standard headers, and thus not process them a second time (except assert.h as mentioned above).  Or, a standard header may include compiler-specific magic (mostly #pragma statements), or "include guards".
But the effect of including any other header more than once need not be same, and then it is up to the header-writer to make sure there is no conflict.
For example, given a header:
int a;
including it twice will result in two definitions of a.  This is a Bad Thing.
The easiest way to avoid conflict like this is to use include guards as defined above:
#ifndef H_HEADER_NAME_
#define H_HEADER_NAME_
/* header contents */
#endif
This works for all the compilers, and doesn't rely of compiler-specific #pragmas. (Even with the above, it is a bad idea to define variables in a header file.)
Of course, in your code, you should ensure that the macro name for include guard satisfies this:
- It doesn't start with Efollowed by an uppercase character,
- It doesn't start with PRIfollowed by a lowercase character orX,
- It doesn't start with LC_followed by an uppercase character,
- It doesn't start with SIG/SIG_followed by an uppercase character,
..etc. (That is why I prefer the form H_NAME_.)
As a perverse example, if you want your users guessing about certain buffer sizes, you can have a header like this (warning: don't do this, it's supposed to be a joke).
#ifndef SZ
#define SZ 1024
#else
#if SZ == 1024
#undef SZ
#define SZ 128
#else
#error "You can include me no more than two times!"
#endif
#endif