为什么`struct stat`中的字段名为st_something?

时间:2012-04-26 00:55:26

标签: c struct stat

这是参考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_开头,并且无法在Internet上找到好的解释。

3 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:4)

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

这是每个人通常使用大写字母用于宏的原因之一,而小写字母用于其他标识符,但不幸的是,这并不总是可行的。 C库本身具有小写的宏:基本上库中的每个函数都可能有一个宏对应物,为了优化目的“重载”该函数。在您的示例中,您可以轻松地想象在C(POSIX,无论如何)中出现函数blksize。如果有一天st_成员没有stat前缀你想要超载该功能,那么你就会遇到麻烦。

使用C11及其类型通用宏,使用_Generic这样的宏将更加常见。因此,如果您正在设计一个将在大量代码中使用的库,而您没有掌握如何选择标识符,那么您仍然可以使用这样的命名约定。

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

答案 2 :(得分:0)

我认为这是一个命名约定,所以当你看到st _...时,你知道它是stat结构的一部分(以st开头)。