C ++编译错误:gnu_printf是无法识别的格式函数类型

时间:2018-08-26 01:43:17

标签: c++ printf compiler-warnings

编译时,我在.h文件的3行不同代码中收到相同的警告,例如:

  

警告gnu_printf是无法识别的格式函数类型

我的标志如下:

  

CFLAGS + = -Wall -Wextra -Wformat -Wno-ignored-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 :(得分:1)

显然失败的代码是:

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

这似乎适用于4.4.7版和gcc干线(9.0.0)之间的任何gcc。 GCC 4.1.2失败,原因:

<source>:7: warning: 'gnu_printf' is an unrecognized format function type

此外,c总是在此失败:

<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