【问题标题】:printing size_t: format '%lu' expects argument of type 'long unsigned int'打印 size_t:格式“%lu”需要“long unsigned int”类型的参数
【发布时间】:2013-06-16 11:17:00
【问题描述】:

我尝试通过强制转换为 unsigned long 来打印 size_t(如“C 编程现代方法”一书中所建议的那样),如下所示:

printf("size:%lu, bsize:%lu", (unsigned long)size, (unsigned long)bsize);
printf("size:%lu, bsize:%lu", ((unsigned long)size), ((unsigned long)bsize));

第一行会给我警告(gcc):

warning: format '%lu' expects argument of type 'long unsigned int', but argument 2 has type 'size_t' [-Wformat]

第一行和第二行有什么区别?我所做的只是添加额外的括号,这到底是做什么的?

我知道我可以使用“%z”,但这个问题困扰着我。

【问题讨论】:

  • 您的错误信息与您的示例无关,请检查您的示例程序。
  • 你为什么不把它投到int 呢?或者您可以使用%zu 格式。应尽可能避免强制转换。
  • 在 32 位操作系统上,size_t 很可能是 unsigned int
  • 工作正常:ideone.com/JBszdh
  • 好吧,也许我确实有一些宏搞砸了,让我检查一下。

标签: c gcc printf


【解决方案1】:

假设周围没有丑陋的#defines

printf("size:%lu, bsize:%lu", (unsigned long)size, (unsigned long)bsize);

printf("size:%lu, bsize:%lu", ((unsigned long)size), ((unsigned long)bsize));

是等价的。

因此它们将导致相同的代码/警告/错误。

如果他们不这样做,那就是有东西坏了。

【讨论】:

  • 好吧,也许这是一些愚蠢的宏,我还没有弄清楚,但是一个简单的例子就可以了。谢谢。
猜你喜欢
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 2018-05-23
  • 2014-01-02
  • 1970-01-01
  • 2013-10-17
相关资源
最近更新 更多