14

我试图摆脱程序中的虚假警告。windows 64下(linux下没有这个警告)这个语句:

printf("%llu",UINT64_MAX);

生成以下警告:

warning: unknown conversion type character 'l' in format [-Wformat]|

输出似乎是正确的,警告不应该在那里。我能找到的最相关的 gcc 相关帖子是 2008 年的这个错误报告http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37768

如果我据此正确理解,则此警告源于以下事实:gcc 调用不符合 C99 的 MSVC printf 并且无法理解 printf 中的 unsigned long long 格式。在同一页面上,建议的解决方案是使用名为 gnu_printf 的东西。我试图用谷歌搜索,但我没有找到要包含的标题。

所以问题是应该如何处理才能便携?我只想以正确且不草率的方式摆脱警告。

4

2 回答 2

8

我猜你可能已经知道了,来自http://comments.gmane.org/gmane.comp.gnu.mingw.w64.general/4670(注意:死链接;请参阅Internet 档案的副本),

问题是并非所有 msvcrt-DLL 版本都支持 formatter-width 说明符%ll,因此 gcc 会警告它的使用。以向后兼容的方式在 msvcrt 的格式化程序中指定 64 位整数标量宽度的变体是使用%I64.

于 2012-05-26T05:39:04.710 回答
2

使用 gcc 6.2.1,您可以使用-fno-builtin选项。

该选项使 gcc 认为它printf不是内置的(毕竟是这种情况),并且警告消失了,printf就像您编写的任何函数一样被对待。

不过要小心,因为在这种情况下不再执行格式检查,并且还有其他副作用,因为该选项涵盖了其他内置函数。

一个更好的选择是通过将宏设置为根本使用 Microsoft 版本:printf __USE_MINGW_ANSI_STDIO

gcc -D__USE_MINGW_ANSI_STDIO=1 ...

(参考:C 程序转换为 Windows 后显示 %zu)。它允许使用%zu微软printf不支持的说明符,并且您保持格式化警告。

于 2018-03-01T08:45:11.623 回答