2012-04-26 27 views
8

To w nawiązaniu do the structure for information about a file inode:Dlaczego pola w `struct stat` nazywają st_something?

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 */ 

prostu szukam dla każdego rodzaju odpowiedź naprawdę. Zauważyłem, że wszystkie pola zaczynają się od st_ i nie mogą znaleźć dobrego wyjaśnienia w Internecie.

+2

Aby wskazać, że zawierają dane "stat". –

Odpowiedz

15

To cofa długą drogę, aż do pierwszych wersji C. Nie mieli oddzielnej tabeli symboli dla członków struktury, nazwy zostały dodane do globalnej tablicy symboli. Z powodu oczywistego paskudnego globalnego zanieczyszczenia przestrzeni nazw, które powoduje. Sposób obejścia tego problemu był taki sam, jak w dzisiejszych wyliczeniach, poprzedzając je kilkoma literami, aby uniknąć kolizji nazw.

To coś w rodzaju historycznego zapisu. Gdy zobaczysz strukturę z takimi nazwami członków, wiesz, że jest to stary.

0

Założę się, że jest to konwencja nazewnictwa, więc gdy zobaczysz st _..., wiesz, że jest to część struktury statystyk (która zaczyna się od st).

+0

Nie sądziłem, że to będzie takie proste, ale wydaje się, że tak, dziękuję. – joethecoder

4

Oprócz odpowiedzi Hansa, myślę, że nazwa kolizji jest wciąż aktualna. Mimo że w nowoczesnych polach C struct nie ma ich w globalnej przestrzeni nazw, mogą one być w konflikcie z definicjami makr.

Jest to jeden z powodów, dla których każdy zwykle używa dużych liter w przypadku makr i małych liter w przypadku innych identyfikatorów, ale niestety nie zawsze jest to możliwe. Sama biblioteka C ma makra, które są pisane małymi literami: w zasadzie każda funkcja w bibliotece może mieć makryczny odpowiednik, który "przeciąża" funkcję dla celów optymalizacji. W twoim przykładzie możesz łatwo wyobrazić sobie w C (POSIX, cokolwiek) funkcję blksize. Gdyby nie było pewnego przedrostka st_ dla członków stat, któregoś dnia chciałbyś przeciążyć tę funkcję, miałbyś kłopoty.

Z makrami C11 i typowymi makrami, które używają _Generic, takie makra będą jeszcze bardziej popularne. Jeśli więc projektujesz bibliotekę, która ma być używana w wielu kodach, w których nie masz rąk do wyboru identyfikatorów, to nadal będziesz mieć lepszą pozycję przy takiej konwencji nazewnictwa.

Wszystko to dotyczy nie tylko członków struct, ale także nazw parametrów i zmiennych funkcji inline.

+1

Jednym z przykładów są makra, takie jak '#define st_atime st_atim.tv_sec', które powodują, że' st_atime' jest nazwą globalną, która nie respektuje reguł scopingu. – musiphil

Powiązane problemy