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.
#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. */