考虑
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年左右的现代意义相反, +=
赋值运算符家族)。