Message "defined" is treated as an identifier here, not an operator. Description For compatibility with older C compilers, in certain modes the compiler will treat #ifdef defined(foo) as #ifdef defined, and #ifndef defined(foo) as #ifndef defined. This might not have been what you intended. User Action Do not mix #ifdef/#ifndef with the defined operator.