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

joe*_*der 9 c struct stat

这是关于文件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 */
Run Code Online (Sandbox Code Playgroud)

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

Han*_*ant 16

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

这是一段历史记录.当您看到具有这些成员名称的结构时,您知道它已经过时了.


Jen*_*edt 6

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

这是每个人通常使用大写字母表示宏、使用小写字母表示其他标识符的原因之一,但不幸的是,这并不总是可行。C 库本身具有小写的宏:基本上库中的每个函数都可能有一个宏对应项,用于“重载”该函数以达到优化目的。在你的例子中,你可以很容易想象在 C (POSIX,无论什么)中出现一个 function blksize。如果有一天您想要重载该st_函数stat,那么您就会遇到麻烦。

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

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