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. Listing: Using # in Macro Definitions and Listing: Identifiers After #endif show examples.
#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". */
#ifdef __CWCC__ /* . . . */ #endif __CWCC__ /* OK if ANSI_strict is disabled. */ #ifdef __CWCC__ /* . . . */ #endif /*__CWCC__*/ /* Always OK. */