Почему поля в 'struct stat' называются st что-то?


Это относится к структуре для информации о файле 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_ и не могу найти хорошего объяснения в Интернете.

3 8

3 ответа:

Это восходит к далекому прошлому, вплоть до первых версий C. У них не было отдельной таблицы символов для членов структуры, имена были добавлены в глобальную таблицу символов. С очевидным неприятным глобальным загрязнением пространства имен, которое вызывает. Обходной путь был тем же самым, который вы используете для перечислений сегодня, добавляя к ним несколько букв, чтобы избежать коллизий имен.

Это своего рода исторический рекорд. Когда вы видите структуру с такими именами членов, вы знаете, что это так старый .

В дополнение к ответу Ганса, я думаю, что коллизия имен все еще актуальна. Несмотря на то, что современные поля C struct не находятся в глобальном пространстве имен, они могут конфликтовать с определениями макросов.

Это одна из причин, по которой все обычно используют верхний регистр для макросов и нижний регистр для других идентификаторов, но, к сожалению, это не всегда возможно. Сама библиотека C имеет макросы, которые написаны в нижнем регистре: в основном каждая функция в библиотеке может иметь макрос аналог, который "перегружает" функцию в целях оптимизации. В вашем примере вы можете легко представить, что в C (POSIX, что угодно) появляется функция blksize. Если бы не было префикса st_ для членов stat, Однажды вы захотели бы перегрузить эту функцию, вы были бы в беде.

С C11 и его типом универсальные макросы, которые используют _Generic такие макросы будут еще более распространены. Поэтому, если вы разрабатываете библиотеку, которая будет использоваться в большом количестве кода, где у вас нет рук, как идентификаторы выбраны, вы все равно лучше с таким соглашением об именовании.

Все это относится не только к членам struct, но и к именам параметров и переменным функций inline.

Я бы предположил, что это соглашение об именовании, так что когда вы видите st_..., вы знаете, что это часть структуры stat (которая начинается с st).