【问题标题】:Placeholder for ino_t [duplicate]ino_t 的占位符 [重复]
【发布时间】:2013-10-04 10:54:47
【问题描述】:

有人知道ino_t 类型的占位符是什么吗? 我正在尝试使用 printf 将其打印出来,并尝试了 %d、%i、%s 和其他方法,但没有成功。

printf( " file name = %s, i-node number=**%d**\n", direntp->d_name, direntp->d_ino);

warning: format ‘%i’ expects argument of type ‘int’, but argument 3 has type ‘__ino_t’ [-Wformat]

请假设我的其他代码是正确的。 大多数示例仅显示如何打印名称,而不是 inode 编号。 我也搜索了很多地方。

提前致谢

【问题讨论】:

标签: c linux


【解决方案1】:

如果您知道类型是整数,则可以将其强制转换为unsigned long long,并使用%llu

printf( " file name = %s, i-node number=%llu\n",
       direntp->d_name, (unsigned long long)direntp->d_ino);

【讨论】:

  • 是的。我给出了几乎完全相同的答案。逐词地。同时。 :)
【解决方案2】:

为了记录:那些被称为“转换说明符”。

据我所知,ino_t 没有转换说明符。如果您确定它是整数,则将其转换为 unsigned long long 并使用 "%llu"

【讨论】:

  • 当然是 +1,因为我没有太多机会为自己的答案投票。 ;-)
  • @jxh 出于同样的原因。很少发生:)
  • 最安全的方法是使用来自stdint.hintmax_t 和来自inttypes.hPRIdMAX。爱荷华州,printf("ino=%" PRIdMAX "\n", (intmax_t)direntp->d_ino);。或者,因为它可能应该是未签名的,printf("ino=%" PRIuMAX "\n", (uintmax_t)direntp->d_ino);
  • @glglgl 几乎正确。正如您可能已经意识到的那样,我试图想出一些不需要这些类型的东西,尽管这显然不是一个正当的理由,因为任何理智的系统都支持 POSIX C99,因为这是一个POSIX问题,努力支持Windows是无稽之谈。但是,unsigned long long 最长的标准无符号整数类型,所以我看不出有什么理由比使用 uintmax_t 更安全。
【解决方案3】:

ino_t 是 typedef 到 unsigned long。 所以打印相同的限定符是 %lu。

【讨论】:

  • 对所有平台都适用吗?
  • 谢谢,效果很好。
  • 我很确定有些系统具有 32 位 longs 和 64 位 inums。所以你的答案肯定是错的。
猜你喜欢
  • 2013-11-27
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 2013-07-10
  • 2015-01-12
  • 2022-01-13
  • 2015-06-27
  • 2014-07-14
相关资源
最近更新 更多