结构的成员名称中的前缀

PSk*_*cik 19 c linux

考虑

struct iovec {
   ptr_t iov_base; /* Starting address */
   size_t iov_len; /* Length in bytes */
};
Run Code Online (Sandbox Code Playgroud)

要么

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 */
};
Run Code Online (Sandbox Code Playgroud)

为这些成员名称添加前缀是什么意义(iov_,st_)?

Jon*_*ler 31

很久以前(甚至在我开始用C编程之前的方式,这是30多年前),结构元素的成员名称必须在程序中的所有结构中是唯一的 - 而不是'每个结构标记'作为这个要求现在已经出现,并且自K&R时代开始--Cn 编程语言第1版,由Kernighan&Ritchie,1978年.

因此,在那些日子里,前缀有助于将一种结构类型的成员与其他每种结构类型分开.因此,使用这种前缀的习惯越来越多,并且它继续使用最近开发的结构类型.的struct stat历史可以追溯到旧体制的日子.struct iovec是一个更近期的发明(可能在20世纪80年代的某个时候),它遵循旧的传统.

使用前缀没有坏处.它可能略有帮助.如果你看到gadzooks.st_mtime,你不需要gadzooks高度自信地猜测它的类型struct stat.

顺便提一下,你可以找到早期版本的"The C Reference Manual"作为Unix第7版手册(Unix程序员手册第2A卷)的一部分,该手册说明了(p244第8.5节,重点增加):

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

同样的手动文件早已废弃不用=+的家庭赋值运算符(在对比的是现代的,距今约1976年的意思,+=家庭赋值运算符).

  • 但它不应该用在现代代码中.这样的前缀使更改类型或重构变得更加困难并且没有任何用处.不应该使用变量名称对类型进行编码,而是应该使用一个名称来描述对象的用途,resp.它在语义上是什么意思. (6认同)
  • @MilesRout:使用适当的工具,那些小优点消失了。但是缺点仍然存在。根据您的论点,我们不应该使用名称空间和范围。您为什么认为我们已有几十年了?如果需要对类型进行编码,请使用变量名(匈牙利表示法,也是一种不好的做法,请参见Wikipedia),而不是成员名;无论如何,他们很快就在更大的项目中变得模棱两可。 (2认同)