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版本.它们没有结构成员的单独符号表,名称被添加到全局符号表中.由于明显令人讨厌的全球命名空间污染导致.解决方法与今天在枚举上使用的解决方法相同,前缀为几个字母,以避免名称冲突.
这是一段历史记录.当您看到具有这些成员名称的结构时,您知道它已经过时了.
除了汉斯的回答之外,我认为名字冲突的事情仍然是现实的。即使现代 Cstruct字段不在全局名称空间中,它们也可能与宏定义冲突。
这是每个人通常使用大写字母表示宏、使用小写字母表示其他标识符的原因之一,但不幸的是,这并不总是可行。C 库本身具有小写的宏:基本上库中的每个函数都可能有一个宏对应项,用于“重载”该函数以达到优化目的。在你的例子中,你可以很容易想象在 C (POSIX,无论什么)中出现一个 function blksize。如果有一天您想要重载该st_函数stat,那么您就会遇到麻烦。
使用 C11 及其类型的通用宏,使用_Generic此类宏将更加常见。因此,如果您正在设计一个要在大量代码中使用的库,而您不知道如何选择标识符,那么最好使用这样的命名约定。
所有这些不仅适用于struct成员,还适用于inline函数的参数名称和变量。