【问题标题】:Compiler warning about printf() long unsigned int and uint32_t关于 printf() long unsigned int 和 uint32_t 的编译器警告
【发布时间】:2011-02-10 18:28:57
【问题描述】:

在我的 C 代码中,我是 fprintfing "%lu" 并为相应的字段提供 uint32_t。但是,当我在 GCC(版本 4.2.4)中使用 -Wall 编译时,我收到以下警告:

writeresults.c:16: warning: format '%4lu' expects type 'long unsigned int', but argument 2 has type 
`uint32_t'

uint32_tlong unsigned int 在 32 位架构上不是同一个东西吗?如果不消除 -Wall 编译器开关或使用类型转换(如果可以,如何),是否可以避免此警告?

是的,我仍在使用 32 位计算机/arch/OS/编译器(目前太差,无法负担新的 64 位硬件)。谢谢!

【问题讨论】:

  • 真正的问题:“我如何让 gcc 在 long == int 的机器上对 {%d with long} 发出警告,因为出于某种原因(可能是 MS compat) int32_t 在机器上被定义为 long 而不是 int,人们坚持在任何地方都使用 int32_t,我真的不想把 (int) 放在传递给 printf 的每一件事之前。

标签: c linux gcc printf


【解决方案1】:

uint32_t 在带有 GCC 的 x86 Linux 上只是 unsigned int。所以使用fprintf(stream, "%4u", ...) (unsigned int) 或更好的是fprintf(stream, "%4" PRIu32, ...) (inttypes.h printf-string 说明符用于uint32_t)。

后者肯定会消除编译器警告/错误,而且是跨平台的。

【讨论】:

  • 呃,你说的“坏”选角在哪里? PRIu32 正确处理uint32_t的定义。
  • 天哪,你是对的!我错了。谢谢。我会删除我的评论。
【解决方案2】:

可靠地抑制警告的最简单方法是使用强制转换:

printf("%lu", (unsigned long)x);

【讨论】:

  • ...这是完全可移植的,因为unsigned long 的最小允许大小足以容纳uint32_t 类型的所有值。
【解决方案3】:

“long int”和“int”在 C++ 中是不同的类型。您可能正在寻找代表“unsigned int”的“u”格式。当然,这取决于“uint32_t”在你的编译器上是什么类型的定义。

【讨论】:

  • 如果它们的大小相同,编译器会意识到这一点,因此它可以知道 ("%d", (long)x ) 可以正常工作,但它会警告您,因为构造不会在其他机器上工作。当然,除非 'long' 真的是一个 int32_t typedef,在这种情况下,它可以在任何 int = 32 位的机器上工作。我希望有办法解决这个问题,并且只对当前情况下真正错误的事情发出警告。
猜你喜欢
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
相关资源
最近更新 更多