title: Extra tokens at end of #ifdef directive
body: <p>Why does the following code compiles?</p>
  
  <pre><code>#ifdef C++11
  // ...
  #endif
  
  int main() {}
  </code></pre>
  
  <p>gcc 4.8.0 gives me the following warning:</p>
  
  <blockquote>
    <p>extra tokens at end of #ifdef directive</p>
  </blockquote>
  
  <p>According to the standard, the macro name can contain only letters, digits and underscore character.</p>
  
  <p>Maybe because this?</p>
  
  <p><strong>ISO/IEC 14882:2011</strong></p>
  
  <blockquote>
    <p>16.1 Conditional inclusion [cpp.cond]</p>
    
    <p>6 Each directive’s condition is checked in order. If it evaluates to
    false (zero), the group that it controls is skipped: directives are
    processed only through the name that determines the directive in order
    to keep track of the level of nested conditionals; the rest of the
    directives’ preprocessing tokens are ignored, as are the other
    preprocessing tokens in the group. Only the first group whose control
    condition evaluates to true (nonzero) is processed. If none of the
    conditions evaluates to true, and there is a #else directive, the
    group controlled by the #else is processed; lacking a #else directive,
    all the groups until the #endif are skipped.151</p>
  </blockquote>
  
  <p>I can't understand this quote correctly.</p>