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