2012-04-26 6 views
8

Dies ist in Bezug auf the structure for information about a file inode:Warum heißen die Felder in `struct stat` 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 */ 

ich für jede Art von Antwort wirklich einfach bin auf der Suche. Ich habe bemerkt, dass alle Felder mit st_ beginnen und keine gute Erklärung im Internet finden können.

+2

Um anzuzeigen, dass sie 'stat' Daten enthalten. –

Antwort

15

Dies reicht weit zurück bis zu den ersten C-Versionen. Sie hatten keine separate Symboltabelle für Strukturelemente, die Namen wurden der globalen Symboltabelle hinzugefügt. Mit der offensichtlich fiesen globalen Namensraumverschmutzung, die verursacht. Die Problemumgehung war dieselbe, die Sie heute für Enums verwenden. Fügen Sie ihnen ein paar Buchstaben voran, um Namenskonflikte zu vermeiden.

Es ist eine Art historischer Rekord. Wenn Sie eine Struktur mit diesen Elementnamen sehen, wissen Sie, dass es alt ist.

0

Ich würde annehmen, dass es eine Namenskonvention ist, so dass, wenn Sie st _... sehen, Sie wissen, dass es ein Teil der Stat-Struktur ist (die mit st beginnt).

+0

Ich dachte nicht, dass es so einfach wäre, aber es scheint so, danke. – joethecoder

4

Zusätzlich zu Hans 'Antwort, denke ich, Name Kollision Sache ist immer noch der Aktualität. Auch wenn mit modernen C struct Felder nicht im globalen Namensraum sind, können sie mit Makrodefinitionen in Konflikt stehen.

Dies ist einer der Gründe, dass normalerweise Großbuchstaben für Makros und Kleinbuchstaben für andere Bezeichner verwendet werden, aber das ist leider nicht immer möglich. Die C-Bibliothek selbst hat Makros, die in Kleinbuchstaben geschrieben sind: Grundsätzlich kann jede Funktion in der Bibliothek ein Makro-Gegenstück haben, das die Funktion zu Optimierungszwecken "überlädt". In Ihrem Beispiel können Sie sich leicht vorstellen, dass in C (POSIX, was auch immer) eine Funktion blksize erscheint. Wenn es kein st_ Präfix für die stat Mitglieder eines Tages geben würde, die Sie diese Funktion überladen möchten, würden Sie in Schwierigkeiten geraten.

Mit C11 und seiner Art generische Makros, die _Generic verwenden, werden solche Makros noch häufiger. Wenn Sie also eine Bibliothek entwerfen, die in einer Menge Code verwendet werden soll, in der Sie nicht wissen, wie die Identifikatoren ausgewählt werden, wäre eine solche Namenskonvention noch besser.

All dies gilt nicht nur für struct Mitglieder, sondern auch für Parameternamen und Variablen von inline Funktionen.

+1

Ein Beispiel sind Makros wie '#define st_atime st_atim.tv_sec', was' st_atime' zu ​​einem globalen Namen macht, der keine Scoping-Regeln berücksichtigt. – musiphil