【问题标题】:printf and %llx in GCC under Windows 64xWindows 64x 下 GCC 中的 printf 和 %llx
【发布时间】:2012-05-26 05:31:45
【问题描述】:

我正在尝试消除程序中的虚假警告。 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 的东西。我试图用谷歌搜索,但没有找到要包含的标题。

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

【问题讨论】:

  • 我仍然使用 PRIu64/PRId64 和类似方法收到警告...这是因为您编写的语法与 C++ 11 不兼容
  • 如果您觉得您有其他答案尚未涵盖的解决方案,我们鼓励您发布答案。请不要编辑问题以包含答案。我已回滚您的编辑。

标签: c gcc


【解决方案1】:

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

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

【讨论】:

  • 谢谢。即使使用 %I64 有效,它也不是便携式答案,但该链接将我引向它!看,实际上答案就在 中。它们具有用于以适当方式调用其中每个变量格式的宏。因此,对于 uint64_t,我将使用 PRIu64。
【解决方案2】:

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

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

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

一个更好的选择是使用微软版本的printf 根本通过设置宏__USE_MINGW_ANSI_STDIO

gcc -D__USE_MINGW_ANSI_STDIO=1 ...

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

【讨论】:

    猜你喜欢
    • 2012-12-13
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    相关资源
    最近更新 更多