Префиксы в именах членов структуры

Рассмотрим

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_)?

Ответы

Ответ 1

Когда-то очень давно (до того, как я даже начал программировать на C, который более 30 лет назад), имена элементов элементов структуры должны были быть уникальными для всех структур в программе - вместо "на каждую структуру" тег ", как это требуется сейчас, и со времен K & R - Язык программирования C 1-е издание, Kernighan и Ritchie, 1978.

Как следствие, в те дни префикс помогал отделять членов одного типа структуры от любого другого типа структуры. Следовательно, привычка развивалась с использованием таких префиксов, и она продолжает развиваться более недавно с использованием типов структуры. struct stat относится ко дням старой системы; struct iovec - это более недавнее изобретение (возможно, когда-то в 1980-х годах), которое следовало старой традиции.

Использование префиксов не наносит вреда. Это может быть незначительно полезно. Если вы видите gadzooks.st_mtime, вам не нужно искать определение gadzooks, чтобы с уверенностью предположить, что он имеет тип struct stat.

Кстати, вы можете найти раннюю версию "Справочного руководства по C" в рамках руководств Unix 7th Edition (Unix Programmer Manual Volume 2A), в котором говорится ( §8.5 на стр. 244, добавлено выделение):

Имена членов структуры и тегов структуры могут быть такими же, как и обычные переменные, поскольку различие может создаваться по контексту. Однако имена тегов и членов должны быть разными. Одно и то же имя участника может появиться в разные структуры только в том случае, если два члена одного типа и если их происхождение относительно их структуры тоже самое; таким образом, отдельные структуры могут совместно использовать общий начальный сегмент.

В этом же руководстве документируется длинное устаревшее семейство операторов присваивания =+ (в отличие от современного, начиная с 1976 года, семейства операторов присваивания +=).