C-Typ-Benennungskonventionen, _t oder ALLCAPS

7

Ich habe mich immer gefragt, ob es irgendwelche Namenskonventionen gibt, wie wann man ALLCAPS für einen Typ verwenden soll und wann man _t anhängen soll (und wann nichts zu verwenden ist?). Ich weiß, dass K & R in den letzten Tagen alle möglichen Dokumente über die Verwendung von C veröffentlicht hat, aber ich konnte nichts darüber finden.

Von den C-Standard-Bibliothekstypen scheint _t sehr dominant zu sein

%Vor%

, im Gegensatz zu FILE , va_list oder struct tm . Gibt es dazu eigentlich Regeln oder ist das völlig willkürlich? Microsoft verwendet immer Typennamen in ALLCAPS in ihrer Windows-API, die zumindest konsistenter als die C-Bibliothek scheint, ehrlich gesagt ...

    
dialer 27.04.2012, 19:22
quelle

7 Antworten

9

Nach dem POSIX-Standard sind alle Typnamen, die auf _t enden, reserviert, wie in hier :

  

Namen, die mit '_t' enden, sind für zusätzliche Typnamen reserviert.

    
Richard J. Ross III 27.04.2012, 19:31
quelle
7

Ich würde versuchen, Ihre Verwendung von typedef zu minimieren. Verwenden Sie das Schlüsselwort struct für Strukturen und verwenden Sie typedef nur, wenn Sie (a) einen undurchsichtigen Typ definieren, der als irgendetwas implementiert werden kann, oder (b) einen Alias ​​für einen arithmetischen Typ definieren, den Sie in Zukunft ändern möchten oder in verschiedenen Konfigurationen (zB wenn Sie float oder double wählen möchten).

Benutze in keinem Fall ALL CAPS, weil es schrecklich hässlich ist, und benutze nicht _t , weil es von POSIX reserviert ist. Das spielt wahrscheinlich keine Rolle, wenn Sie Ihren Typnamen passend voranstellen, aber dann ist das _t am Ende nur unnötige Hässlichkeit und grundlose Unportabilität. Wenn Sie ihnen einfach so vorangehen, sollte das funktionieren: foo_scalar (wobei foo der Name Ihrer Bibliothek / Ihres Moduls ist).

    
R.. 27.04.2012 22:23
quelle
4

Es ist völlig willkürlich - verschiedene Bibliotheksschreiber / Standards verwenden unterschiedliche Konventionen (oder überhaupt keine Konventionen). Wählen Sie einfach eine für Ihren Code und konsistent.

    
Rafe Kettler 27.04.2012 19:25
quelle
3

Es gibt keine, da die Typen, die Sie erwähnen, im Laufe der Jahre aus verschiedenen Standards (wie POSIX) und verschiedenen dominanten Implementierungen angesammelt wurden. Ein Beispiel dafür sind xstr und assert , bei denen es sich jeweils um Makros in Kleinbuchstaben handelt. Stellen Sie jedoch sicher, dass Sie C-FAQ 12.9 gelesen haben und Sie sollten gut gehen.

Vielleicht möchten Sie auch den Abschnitt Reservierte Identifikatoren im Standard nachschlagen. Hier ist, was meine Kopie von N1570 sagt:

  

7.1.3 Reservierte IDs

     

1 Jede Kopfzeile deklariert oder definiert alle Bezeichner, die in der zugehörigen Unterklausel aufgeführt sind, und optional   deklariert oder definiert Kennungen, die in der zugehörigen Zukunft aufgelistet sind   Bibliotheksanweisungen Subclause und Identifikatoren, die immer reserviert sind   entweder für jede Verwendung oder zur Verwendung als Dateibereichsbezeichner. - Alle   Bezeichner, die mit einem Unterstrich und einem Großbuchstaben beginnen   Buchstabe oder ein anderer Unterstrich sind immer für irgendeine Verwendung reserviert. - Alle   Bezeichner, die mit einem Unterstrich beginnen, sind immer für die Verwendung reserviert   als Bezeichner mit Dateibereich sowohl im normalen als auch im Tag-Namen   Räume.

     

- Jeder Makroname in einem der folgenden Unterklauseln   (einschließlich der zukünftigen Bibliotheksanweisungen) ist für die Verwendung als reserviert   angegeben, wenn einer der zugehörigen Header enthalten ist; es sei denn   ausdrücklich anders angegeben (siehe 7.1.4).

     

- Alle Bezeichner mit   externe Verknüpfung in einem der folgenden Unterabschnitte (einschließlich der   zukünftige Bibliotheksanweisungen) und errno sind immer für die Verwendung als reserviert   Bezeichner mit externer Verknüpfung.184)

     

- Jeder Bezeichner mit Datei   Umfang in einem der folgenden Unterabschnitte aufgeführt (einschließlich der Zukunft   Bibliotheksanweisungen) ist für die Verwendung als Makroname und als   Bezeichner mit Dateibereich im selben Namensraum, wenn einer seiner   zugehörige Header sind enthalten.

     

2 Keine anderen Kennungen sind reserviert.   Wenn das Programm einen Bezeichner in einem Kontext deklariert oder definiert, in dem   es ist reserviert (anders als in 7.1.4 erlaubt) oder definiert ein reserviertes   Bezeichner als Makroname, das Verhalten ist nicht definiert.

     

3 Wenn die   Programm entfernt (mit #undef) jede Makrodefinition eines Bezeichners in   Bei der ersten oben aufgelisteten Gruppe ist das Verhalten nicht definiert.

    
dirkgently 27.04.2012 19:31
quelle
1

Die gebräuchlichste Konvention ist, dass Sie (nur) für Makros alle Großbuchstaben verwenden (unabhängig davon, ob es sich um einen Typ handelt oder nicht).

    
Jerry Coffin 27.04.2012 19:26
quelle
1

ALLCAPS werden im Allgemeinen (nicht universell) für Makros verwendet und werden meiner Erfahrung nach selten für Typdefinitionen verwendet. Die häufigsten Konventionen, die ich für Typnamen gesehen habe, sind entweder LeadingUpperMixedCase oder das _t-Suffix (auf die andere hingewiesen haben, kann zu Konflikten mit POSIX führen).

    
John Bode 27.04.2012 20:41
quelle
0

ALL CAPS werden am häufigsten für Konstanten und / oder Makros verwendet. Ich habe es nirgendwo anders als in der Windows API gefunden und würde es nicht empfehlen.

uint8_t usw. ist eine ziemlich häufige Art Namen zu benennen, wie wir aus dem Standard sehen können. Ein anderer gebräuchlicher Weg ist wie This mit nur dem ersten Großbuchstaben.

    
Lundin 27.04.2012 19:54
quelle

Tags und Links