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
, 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 ...
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.
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).
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.
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.
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).
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).
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.
Tags und Links c types naming-conventions