【问题标题】:Are dev_t and ino_t required to be integer types?dev_t 和 ino_t 是否必须是整数类型?
【发布时间】:2018-01-09 13:47:12
【问题描述】:

glibc 的文档坚持它们是整数类型(不比 unsigned int 更窄),但我没有找到说明它们必须是整数类型的标准参考(另请参阅 time_t)。

所以最后,问题变成了:是

#include <stdio.h>
#include <stdint.h>
struct stat st;

if (stat("somefile", &st) == 0) {
        printf("%ju %ju\n", (uintmax_t)st.st_dev, (uintmax_t)st.st_ino);
}

便携。

【问题讨论】:

  • "另见 time_t" --> 在 C 中,time_t 可以是整数:有符号或无符号(这并不常见),或浮点类型。我怀疑使用 POSIX,它仅限于有符号整数类型。

标签: c posix standards libc


【解决方案1】:

POSIX 标准要求 dev_t 为整数类型,ino_t 为无符号整数。

dev_t 应为整数类型。

fsblkcnt_t、fsfilcnt_t 和 ino_t 应定义为无符号整数 类型。

由于intmax_tuintmax_t 应该是“最大宽度”整数,因此您的代码是安全的。 为了确保万一st_dev 是负数,你可以这样写:

    printf("%jd %ju\n", (intmax_t)st.st_dev, (uintmax_t)st.st_ino);

否则,您的代码是安全的。

【讨论】:

    【解决方案2】:

    来自current POSIX specifications

    dev_t 应为整数类型。

    [...]

    ino_t 应定义为无符号整数类型

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      • 2018-01-12
      • 2023-03-31
      • 2019-01-02
      • 2018-11-15
      • 1970-01-01
      • 2019-08-12
      相关资源
      最近更新 更多