Почему поля в '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 ответа:
Это восходит к далекому прошлому, вплоть до первых версий C. У них не было отдельной таблицы символов для членов структуры, имена были добавлены в глобальную таблицу символов. С очевидным неприятным глобальным загрязнением пространства имен, которое вызывает. Обходной путь был тем же самым, который вы используете для перечислений сегодня, добавляя к ним несколько букв, чтобы избежать коллизий имен.
Это своего рода исторический рекорд. Когда вы видите структуру с такими именами членов, вы знаете, что это так старый .
В дополнение к ответу Ганса, я думаю, что коллизия имен все еще актуальна. Несмотря на то, что современные поля C
Это одна из причин, по которой все обычно используют верхний регистр для макросов и нижний регистр для других идентификаторов, но, к сожалению, это не всегда возможно. Сама библиотека C имеет макросы, которые написаны в нижнем регистре: в основном каждая функция в библиотеке может иметь макрос аналог, который "перегружает" функцию в целях оптимизации. В вашем примере вы можете легко представить, что в C (POSIX, что угодно) появляется функцияstruct
не находятся в глобальном пространстве имен, они могут конфликтовать с определениями макросов.blksize
. Если бы не было префиксаst_
для членовstat
, Однажды вы захотели бы перегрузить эту функцию, вы были бы в беде.С C11 и его типом универсальные макросы, которые используют
Все это относится не только к членам_Generic
такие макросы будут еще более распространены. Поэтому, если вы разрабатываете библиотеку, которая будет использоваться в большом количестве кода, где у вас нет рук, как идентификаторы выбраны, вы все равно лучше с таким соглашением об именовании.struct
, но и к именам параметров и переменным функцийinline
.