Windows 64x下的GCC中的printf和%llx

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows 64x下的GCC中的printf和%llx相关的知识,希望对你有一定的参考价值。

我试图摆脱我的程序中的虚假警告。在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调用MSVC printf,它不符合C99并且无法理解printf中的unsigned long long格式。在同一页面上,建议的解决方案是使用名为gnu_printf的东西。我试图谷歌,但我没有找到包含的标题。

所以问题是如何处理以便携带?我只想以正确和非邋way的方式摆脱警告。

答案

正如我猜你可能已经知道的那样,来自http://comments.gmane.org/gmane.comp.gnu.mingw.w64.general/4670(注:死链接;见Internet Archive's copy),

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

另一答案

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

这个选项让gcc认为printf不是内置的(毕竟是这种情况),并且警告消失了,printf被视为与你编写的任何函数一样。

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

更好的选择是不要使用Microsoft版本的printf来设置宏__USE_MINGW_ANSI_STDIO

gcc -D__USE_MINGW_ANSI_STDIO=1 ...

(参考:C program shows %zu after conversion to Windows)。它允许使用%zu说明符,Microsoft printf不支持并且您保持格式化警告。

以上是关于Windows 64x下的GCC中的printf和%llx的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Notepad++和GCC搭建Windows下的C语言学习环境

Windows下的异常处理和堆栈跟踪(MinGW/gcc)

010.Windows环境下的安装gcc

如何使用Notepad++和GCC搭建Windows下的C语言学习环境

最好的GCC for windows还是MinGW-w64官网

基于 TI Sitara系列 AM64x核心板——程序自启动说明