结构成员名称中的前缀

考虑

struct iovec { ptr_t iov_base; /* Starting address */ size_t iov_len; /* Length in bytes */ }; 

要么

 struct stat { 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 */ blksize_t st_blksize; /* blocksize for file system I/O */ blkcnt_t st_blocks; /* number of 512B blocks allocated */ 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 */ }; 

这些成员名称( iov_st_ )的前缀是什么?

从很早以前(甚至在我用30年前的C开始编程之前),结构元素的成员名必须在程序中的所有结构上是唯一的,而不是“每个结构标记”为现在的要求是自1978年由coreighan&Ritchie开发的K&R – C语言程序设计语言第一版以来的。

因此,在那个时候,前缀帮助将一种结构类型的成员与其他结构类型隔离开来。 因此,使用这种前缀的习惯越来越多,并且继续使用最近开发的结构类型。 struct stat历史可以追溯到旧系统的日子。 struct iovec是一个更新的发明(也许在20世纪80年代的某个时候),遵循旧的传统。

使用前缀并没有什么坏处。 这可能是有帮助的。 如果您看到gadzooks.st_mtime ,则不需要高度自信地猜测gadzooks的定义是否为struct stat类型。

顺便说一下,你可以在Unix 7th Edition手册( Unix程序员手册第2A卷 )中找到一个早期版本的“C参考手册”,该手册说明了(p244的§8.5,增加了重点):

结构成员和结构标签的名称可以与普通变量相同,因为可以通过上下文进行区分。 但是,标签和成员的名称必须是明确的。 只有两个成员属于同一类型,并且其结构相同时,同一个成员才能出现在不同的结构中。 因此独立的结构可以共享一个共同的初始段。

同样的手册记录了长期过时的=+赋值运算符家族(与1976年左右的现代意义相反, +=赋值运算符家族)。