10

这是参考有关文件 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_并且在互联网上找不到很好的解释。

4

3 回答 3

19

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

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

于 2012-04-26T01:07:26.207 回答
4

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

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

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

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

于 2012-04-26T06:32:30.490 回答
0

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

于 2012-04-26T00:58:47.387 回答