title: What exactly do C include guards do?
body: <p>Let's say I have a header file &quot;header.h&quot; with a function definition.</p>
  <pre><code>#ifndef HEADER_FILE
  #define HEADER_FILE
  
  int two(void){
  return 2;
  }
  
  #endif
  </code></pre>
  <p>This header file has an include guard. However, I'm kind of confused as to what #define HEADER_FILE is actually doing. Let's say I were to forget the include guard, it would have been perfectly legal for me to completely ignore adding '#define HEADER_FILE'.</p>
  <p>What exactly are we doing when we define HEADER_FILE? What are we defining? And why is it okay to forget the include guard in which case we can also forgot adding #define HEADER_FILE?</p>