Extensions to the Preprocessor

When ANSI strictness is off, the C compiler allows a # to prefix an item that is not a macro argument. It also allows an identifier after an #endif directive. Using # in Macro Definitions and Identifiers After #endif show examples.

Listing 1. Using # in Macro Definitions
#define add1(x) #x #1
    /* OK, if ANSI_strict is disabled,
       but probably not what you wanted:
       add1(abc) creates "abc"#1 
     */

#define add2(x) #x "2"

    /* Always OK: add2(abc) creates "abc2". */
Listing 2. Identifiers After #endif
#ifdef __CWCC__
  /* . . . */
#endif __CWCC__ /* OK if ANSI_strict is disabled. */

#ifdef __CWCC__
  /* . . . */

#endif /*__CWCC__*/ /* Always OK. */