【问题标题】:Why are the fields in `struct stat` named st_something?为什么 struct stat 中的字段命名为 st_something?
【发布时间】:2012-05-06 17:45:45
【问题描述】:

这是参考the structure for information about a file inode:

 dev_t       st_dev;     /* ID of device containing file */
 ino_t       st_ino;     /* inode number */
 mode_t      st_mode;    /* protection */
 nlink_t     st_nlink;   /* number of hard links */
 uid_t       st_uid;     /* user ID of owner */
 gid_t       st_gid;     /* group ID of owner */
 dev_t       st_rdev;    /* device ID (if special file) */
 off_t       st_size;    /* total size, in bytes */
 time_t      st_atime;   /* time of last access */
 time_t      st_mtime;   /* time of last modification */
 time_t      st_ctime;   /* time of last status change */
 blksize_t   st_blksize; /* blocksize for filesystem I/O */
 blkcnt_t    st_blocks;  /* number of blocks allocated */

我只是在寻找任何类型的答案。我注意到所有字段都以st_ 开头,在互联网上找不到很好的解释。

【问题讨论】:

  • 表示它们包含stat 数据。

标签: c struct stat


【解决方案1】:

这可以追溯到很久以前,一直到第一个 C 版本。他们没有单独的结构成员符号表,名称被添加到全局符号表中。伴随着明显的令人讨厌的全局命名空间污染。解决方法与您今天在枚举上使用的解决方法相同,在它们前面加上几个字母以避免名称冲突。

这是一种历史记录。当您看到具有此类成员名称的结构时,您就知道它是旧的

【讨论】:

    【解决方案2】:

    除了汉斯的回答,我认为名字冲突的事情仍然是现实的。即使使用现代 C struct 字段不在全局名称空间中,它们也可能与宏定义发生冲突。

    这是每个人通常使用大写的宏和小写的其他标识符的原因之一,但不幸的是,这并不总是可能的。 C 库本身有小写的宏:基本上库中的每个函数都可能有一个宏对应物,为了优化目的“重载”函数。在您的示例中,您可能很容易想象在 C(POSIX 等)中出现一个函数 blksize。如果有一天stat 成员没有st_ 前缀,您想重载该函数,那您就有麻烦了。

    对于 C11 及其使用 _Generic 的泛型宏类型,此类宏将更加常见。因此,如果您正在设计一个要在大量代码中使用的库,而您不知道如何选择标识符,那么使用这样的命名约定仍然会更好。

    所有这些不仅适用于struct 成员,还适用于inline 函数的参数名称和变量。

    【讨论】:

    • 一个例子是像#define st_atime st_atim.tv_sec 这样的宏,它使st_atime 成为一个不遵守范围规则的全局名称。
    【解决方案3】:

    我假设这是一个命名约定,因此当您看到 st_... 时,您就知道它是 stat 结构的一部分(以 st 开头)。

    【讨论】:

    • 我没想到会这么简单,但看起来确实如此,谢谢。
    猜你喜欢
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 2016-03-14
    相关资源
    最近更新 更多