Видимо, код ошибки:
#ifdef __GNUC__
#define ATTR_WARN_PRINTF(X,Y) __attribute__((format(gnu_printf,X,Y)))
#else
#define ATTR_WARN_PRINTF(X,Y)
#endif
int ATTR_WARN_PRINTF(1,2) OutputDebugStringF(const char* pszFormat, ...);
std::string ATTR_WARN_PRINTF(1,3) real_strprintf(const char *format, int dummy, ...);
bool ATTR_WARN_PRINTF(1,2) error(const char *format, ...);
Кажется, что это работает на любом gcc между версиями 4.4.7 и gcc trunk (9.0.0).GCC 4.1.2 завершается с ошибкой:
<source>:7: warning: 'gnu_printf' is an unrecognized format function type
Кроме того, clang всегда терпит неудачу при этом:
<source>:7:5: warning: 'format' attribute argument not supported: gnu_printf [-Wignored-attributes]
Но из первоначального вопроса кажется, что проблема со слишком старым GCC,Чтобы исправить это, проверьте номер версии GCC:
#if defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__>= 4) || __GNUC__ > 4)
# define ATTR_WARN_PRINTF(X,Y) __attribute__((format(gnu_printf,X,Y)))
#elif defined(__GNUC__)
# define ATTR_WARN_PRINTF(X,Y) __attribute__((format(printf,X,Y)))
#else
# define ATTR_WARN_PRINTF(X,Y)
#endif
Может быть, даже лучше ограничить формат printf
вместо gnu_printf
, и поэтому указанное выше условие можно упростить.
РЕДАКТИРОВАТЬ: Как можно найти в истории GCC, формат gnu_printf
был добавлен в gcc-4.4.0 commit r133365 .Из того, что я понимаю, это просто псевдоним printf
, и был добавлен префикс gnu, позволяющий различать printf
разных компиляторов, таких как, возможно, ms_printf
.