2016-03-08 6 views
16

BetrachtenPräfixe in den Mitgliedsnamen einer Struktur

struct iovec { 
    ptr_t iov_base; /* Starting address */ 
    size_t iov_len; /* Length in bytes */ 
}; 

oder

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

Was ist der Punkt, diejenigen Mitgliedsnamen voranstellen (iov_, st_)?

Antwort

28

Einmal vor sehr langer Zeit (lange bevor ich angefangen habe, in C zu programmieren, was vor über 30 Jahren war), mussten die Elementnamen von Strukturelementen in allen Strukturen eines Programms eindeutig sein - statt 'per Struktur-Tag‘als die Anforderung ist jetzt, und hat sich seit den Tagen der K & R gewesen - The C Programming Language 1. Auflage, von Kernighan & Ritchie, 1978

als Folge in jenen Tagen das Präfix die Mitglieder entmischen half von ein Strukturtyp von jedem anderen Strukturtyp. Folglich wuchs die Gewohnheit, solche Präfixe zu verwenden, und es geht mit neueren Strukturtypen weiter. Die struct stat stammt aus den Tagen des alten Systems; struct iovec ist eine neuere Erfindung (vielleicht irgendwann in den 1980er Jahren), die der alten Tradition folgte.

Die Verwendung von Präfixen schadet nicht. Es könnte marginal hilfreich sein. Wenn Sie gadzooks.st_mtime sehen, müssen Sie nicht die Definition von gadzooks suchen, um mit hoher Sicherheit zu erraten, dass es vom Typ struct stat ist.

Im Übrigen können Sie eine frühe Version von 'The C-Referenzhandbuch' als Teil der Unix 7. Auflage Handbücher (Unix Programmer's Manual Volume 2A) finden, die sagt (§8.5 auf P244, Hervorhebung hinzugefügt):

Die Namen Strukturelemente und Strukturkennzeichen können die gleichen sein wie gewöhnliche Variablen, da eine Unterscheidung durch Kontext erfolgen kann. Namen von Tags und Membern müssen jedoch eindeutig sein. Der gleiche Mitgliedsname kann in verschiedenen Strukturen nur erscheinen, wenn die beiden Mitglieder vom gleichen Typ sind und wenn ihre Herkunft in Bezug auf ihre Struktur das gleiche ist; so können sich getrennte Strukturen ein gemeinsames Anfangssegment teilen.

Die gleiche Handbuch dokumentiert die lange obsolet =+ Familie der Zuweisungsoperator (im Gegensatz zu dem modernen, seit etwa 1976 bedeutet, += Familie der Zuweisungsoperator).

+4

Es sollte jedoch nicht in modernen Code verwendet werden. Solche Präfixe machen das Ändern von Typen oder Refactoring viel schwieriger und dienen keinem Zweck. Anstatt den Typ in einem Variablennamen zu kodieren, sollte man einen Namen verwenden, der beschreibt, wofür das Objekt verwendet wird. was es semantisch beinhaltet. – Olaf

+1

@Olaf Ich sehe nicht, wie Sie sagen können, dass sie "keinen Zweck erfüllen". Eine Verwendung wurde bereits in der Antwort gegeben: den Typ einer Struktur aus den Namen ihrer Mitglieder zu sehen. Eine andere Verwendung ist, dass sie leicht 'grep'pable und' man -K'-fähig sind. –

+0

@MilesRout: Verwenden Sie die richtigen Tools und diese kleinen Profis verschwinden. Aber die Nachteile bleiben. Mit Ihrer Argumentation sollten wir keine Namensräume und Bereiche verwenden. Warum denken Sie, wir haben sie seit Jahrzehnten? Wenn Sie den Typ codieren müssen, tun Sie das im Variablennamen (ungarische Notation, auch schlechte Praxis, siehe Wikipedia), nicht die Mitglieder; Sie werden in einem größeren Projekt sowieso mehrdeutig. – Olaf

Verwandte Themen