-fgnu89-inline / C99 / C++ inline modes are all different. For C++, perhaps neither __GNUC_STDC_INLINE__ nor __GNUC_GNUC_INLINE__ should be defined. % g++ -dM -E -xc++ /dev/null | grep __GNUC_STDC_INLINE__ #define __GNUC_STDC_INLINE__ 1 gcc/doc/cpp.texi does not talk about C++ @item __GNUC_STDC_INLINE__ GCC defines this macro if functions declared @code{inline} will be handled according to the ISO C99 or later standards. Object files will contain externally visible definitions of all functions declared @code{extern inline}. They will not contain definitions of any functions declared @code{inline} without @code{extern}. If this macro is defined, GCC supports the @code{gnu_inline} function attribute as a way to always get the gnu90 behavior. Side note: there is "warning: command-line option ‘-fgnu89-inline’ is valid for C/ObjC but not for C++" but __attribute__((gnu_inline)) is usable in C++ mode and has strange codegen behaviors.