Ошибка компиляции C ++: gnu_printf - нераспознанный тип функции формата - PullRequest
0 голосов
/ 26 августа 2018

При компиляции я получаю одно и то же предупреждение о 3 разных строках кода в файле .h, например:

предупреждение gnu_printf - это нераспознанный тип функции формата

Мои флаги выглядят так:

CFLAGS + = -Wall -Wextra -Wformat -Wno-ignore-qualifiers -Wformat-security -Wno-unused-parameter \

Примеры трех строк кода, приводящих к этой ошибке ниже:

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, ...);

У меня есть много других применений printf() в этом файле, которые не вызывают никаких ошибок. Я немного запутался в ошибке форматирования.

1 Ответ

0 голосов
/ 26 августа 2018

Видимо, код ошибки:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...