https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90835
--- Comment #13 from Jeremy Huddleston Sequoia <jeremyhu at macports dot org> --- Also note that <sys/cdefs.h> also already does the following: /* * Compatibility with compilers and environments that don't support compiler * feature checking function-like macros. */ #ifndef __has_builtin #define __has_builtin(x) 0 #endif #ifndef __has_include #define __has_include(x) 0 #endif #ifndef __has_feature #define __has_feature(x) 0 #endif #ifndef __has_attribute #define __has_attribute(x) 0 #endif #ifndef __has_extension #define __has_extension(x) 0 #endif which might be why you see the problematic behavior sometimes but not always, depending on header include order =/