Was stellt ein Typ gefolgt von _t (Unterstrich-t) dar?

Lesezeit: 7 Minuten

Benutzeravatar von Kevin Griffin
Kevin Greif

Dies scheint eine einfache Frage zu sein, aber ich kann sie mit der Stack Overflow-Suche oder Google nicht finden. Was bedeutet ein Typ, gefolgt von a _t bedeuten? Wie zum Beispiel

int_t anInt;

Ich sehe es oft in C-Code, der sich eng mit Hardware befassen soll – ich kann nicht anders, als zu glauben, dass sie verwandt sind.

  • Wo ist int_t definiert? Wenn es immer so definiert ist int, es ist nicht nützlich; Es ist viel übersichtlicher zu verwenden int direkt. Wenn es nicht immer so definiert ist int (sagen, wenn es sein könnte long int oder short int), dann ist es ein schlecht gewählter und verwirrender Name.

    – Keith Thompson

    24. Juli 2015 um 17:32 Uhr

Benutzeravatar von Jonathan Leffler
Jonathan Leffler

Wie Douglas Mayle feststellte, bezeichnet es im Grunde einen Typennamen. Folglich wäre es nicht ratsam, Variablen- oder Funktionsnamen mit ‘_t“, da dies zu Verwirrung führen könnte. Ebenso gut wie size_tdefiniert der C89-Standard wchar_t, off_t, ptrdiff_t, und wahrscheinlich einige andere, die ich vergessen habe. Der C99-Standard definiert viele zusätzliche Typen, wie z uintptr_t, intmax_t, int8_t, uint_least16_t, uint_fast32_t, usw. Diese neuen Typen sind formal definiert in <stdint.h> aber am häufigsten werden Sie verwenden <inttypes.h> was (ungewöhnlich für Standard-C-Header) beinhaltet <stdint.h>. Es (<inttypes.h>) definiert auch Makros zur Verwendung mit der printf() und scanf().

Wie Matt Curtis feststellte, hat das Suffix für den Compiler keine Bedeutung; es ist eine menschenorientierte Konvention.

Allerdings sollte man das auch beachten Posix definiert viele zusätzliche Typnamen, die auf ‘ enden_t‘, und reserviert das Suffix für die Umsetzung. Das heißt, wenn Sie auf POSIX-bezogenen Systemen arbeiten, ist es nicht ratsam, Ihre eigenen Typnamen mit der Konvention zu definieren. Das System, an dem ich arbeite, hat es getan (seit mehr als 20 Jahren); Wir werden regelmäßig von Systemen gestolpert, die Typen mit dem gleichen Namen definieren, den wir selbst definieren.

  • Es scheint vernünftig, dass Betriebssysteme und allgemeine Laufzeitbibliotheken Typen mit generischen Namen definieren. aber sollte den Typen Ihrer Firma nicht auch ein Präfix oder so etwas vorangestellt werden?

    – Spielzeugbauer

    23. Oktober 2008 um 22:38 Uhr

  • Ich verwende _type anstelle von _t in meinen Typedefs, um genau das zu vermeiden.

    – CesarB

    23. Oktober 2008 um 23:51 Uhr

  • @Jonathan Leffler – Welche Namenskonvention würden Sie für benutzerdefinierte Typen verwenden?

    – J. Andrew Laughlin

    18. April 2011 um 21:43 Uhr

  • @Andrew: Wenn Sie eine praktische Abkürzung als Präfix verwenden können, können Sie sie sicher verwenden abbr_xxxxx_t Namen eingeben. Ohne ein solches Präfix können Sie jederzeit erwischt werden. Im Allgemeinen ist die standardisierte _t Typen verwenden alle Kleinbuchstaben (FILE und DIR sind zwei Ausnahmen, zweimal – alle Großbuchstaben, und nein _t), also könnten Sie verwenden CamelCase_t mit mäßiger Sicherheit, mit oder ohne die führenden Kappen. Das System, an dem ich hauptsächlich arbeite, neigt dazu, gefährlich zu leben und zu verwenden _t trotzdem, aber es hat uns gelegentlich gebissen. Ich neige dazu zu verwenden CamelCase ohne Suffix für meine eigene Arbeit; Meine Funktionen sind normalerweise alle in Kleinbuchstaben.

    – Jonathan Leffler

    18. April 2011 um 22:45 Uhr

  • @JonathanLeffler, ich habe angefangen, diese Konvention zu verwenden, CamelCase für Typen, Kleinbuchstaben für Funktionen. Ich suchte diese Frage in der Hoffnung, dass ich nicht der einzige war. Danke für die Bestätigung!

    – Austin Mullins

    13. Juni 2014 um 22:26 Uhr

Es ist eine Konvention zur Benennung von Datentypen, zB with typedef:


typedef struct {
  char* model;
  int year;
...
} car_t;

  • Verwenden Sie nicht die _t Suffix für eigene Typen, da sie in manchen Standards reserviert sind, besser verwenden _T. Auch nie typedef ein anonymer structvorwärts dies zu erklären struct wird unmöglich. Gib die struct einen Namen oder nicht verwenden typedef überhaupt.

    – 12431234123412341234123

    7. September 2020 um 9:40 Uhr


  • Um das zu ergänzen, was 12431 … (der Typ über mir) gesagt hat, sollten Sie im Allgemeinen NIEMALS typedef Zeiger und Strukturen/Unions. Dies ist verwirrend und dient nur dazu, Typinformationen zu verschleiern. struct foo f; und union userinput *ui_ptr; sind viel klarer und leichter zu verstehen als foo f; und userinput ui;. Ich weiß, es ist verlockend, einen kurzen Typnamen zu haben, aber tun Sie es nicht. Funktionszeiger sind die einzige Ausnahme, wo es meiner Meinung nach in Ordnung ist, z typedef void (*foobarfn)(struct foobar *);foobarfn my_callback = find_response(some_input);

    – Braden Best

    14. Dezember 2021 um 23:50 Uhr


Benutzeravatar von Benoit
Benoit

Das _t umschließt normalerweise eine undurchsichtige Typdefinition.

GCC fügt lediglich Namen hinzu, die auf enden _t in den reservierten Namespace, den Sie nicht verwenden dürfen, um Konflikte mit zukünftigen Versionen von Standard C und POSIX zu vermeiden (Handbuch der GNU C-Bibliothek). Nach einiger Recherche fand ich endlich die richtige Referenz im POSIX-Standard 1003.1: B.2.12 Datentypen (Volumen: BegründungAnhang: B. Begründung für SystemschnittstellenKapitel: B.2 Allgemeine Informationen):

B.2.12 Datentypen
Definierte Typen

Die Anforderung, dass zusätzliche Typen, die in diesem Abschnitt definiert werden, auf „_t“ enden, wurde durch das Problem der Namensraumverschmutzung ausgelöst. Es ist schwierig, einen Typ (wobei dieser Typ nicht von POSIX.1-2017 definiert ist) in einer Header-Datei zu definieren und ihn in einer anderen zu verwenden, ohne dem Namensraum des Programms Symbole hinzuzufügen. Damit Implementierer ihre eigenen Typen bereitstellen können, müssen alle konformen Anwendungen Symbole vermeiden, die mit „_t“ enden, wodurch der Implementierer zusätzliche Typen bereitstellen kann. Da Typen hauptsächlich in der Definition von Strukturmitgliedern verwendet werden, die zu den in POSIX.1-2017 definierten Strukturen hinzugefügt werden können (und in vielen Fällen müssen), ist der Bedarf an zusätzlichen Typen zwingend.

Kurz gesagt, der Standard sagt, dass es gute Chancen gibt, die Liste der Standardtypen zu erweitern, daher schränkt der Standard die ein _t Namensraum für den eigenen Gebrauch.

Zum Beispiel passt Ihr Programm POSIX 1003.1 Ausgabe 7 und Sie haben einen Typ definiert foo_t. POSIX 1003.1 Ausgabe 8 wird schließlich mit einem neu definierten Typ veröffentlicht foo_t. Ihr Programm stimmt nicht mit der neuen Version überein, was ein Problem sein könnte. Einschränkung der _t Verwendung verhindert, dass der Code umgestaltet wird. Wenn Sie also eine POSIX-Konformität anstreben, sollten Sie dies unbedingt vermeiden _t wie es der Standard vorschreibt.

Nebenbemerkung: Ich persönlich versuche, mich an POSIX zu halten, weil ich denke, dass es gute Grundlagen für eine saubere Programmierung bietet. Außerdem bin ich ziemlich lieb Linux-Codierungsstil (Kapitel 5) Richtlinien. Es gibt einige gute Gründe, warum man typedef nicht verwendet. Ich hoffe das hilft!

Es ist eine Standard-Namenskonvention für Datentypen, die normalerweise von typedefs definiert wird. Ein Großteil des C-Codes, der sich mit Hardwareregistern befasst, verwendet C99-definierte Standardnamen für vorzeichenbehaftete und vorzeichenlose Datentypen mit fester Größe. Als Konvention stehen diese Namen in einer Standardheaderdatei (stdint.h) und enden mit _t.

Benutzeravatar von Toybuilder
Spielzeugbauer

Das _t hat an sich keine besondere Bedeutung. Aber es ist allgemein gebräuchlich geworden, das hinzuzufügen _t Suffix für Typedefs.

Sie sind vielleicht besser mit gängigen C-Praktiken für die Benennung von Variablen vertraut … Dies ist ähnlich wie es üblich ist, ap für einen Zeiger voranzustellen und einen Unterstrich vor globalen Variablen zu verwenden (dies ist etwas seltener). , und um die Variablennamen zu verwenden i, jund k für temporäre Schleifenvariablen.

In Code, in dem Wortgröße und Reihenfolge wichtig sind, werden häufig explizit definierte benutzerdefinierte Typen verwendet, z BYTE WORD (normalerweise 16-Bit) DWORD (32 Bit).

int_t ist nicht so gut, weil die definition von int variiert zwischen den Plattformen – also wessen int passt du dich an? (Obwohl heutzutage die meisten PC-zentrierten Entwicklungen es als 32 Bit behandeln, behandeln viele Dinge für die Nicht-PC-Entwicklung immer noch ints als 16 Bit).

  • Für mich ist dies die beste Antwort. Tolle, einfache und auf den Punkt gebrachte Erklärung. Danke @Toybuilder.

    – afp_2008

    31. Mai um 21:42 Uhr

Benutzeravatar von Matt Curtis
Matt Curtis

Es ist nur eine Konvention, die “Typ” bedeutet. Für den Compiler bedeutet es nichts Besonderes.

  • Für mich ist dies die beste Antwort. Tolle, einfache und auf den Punkt gebrachte Erklärung. Danke @Toybuilder.

    – afp_2008

    31. Mai um 21:42 Uhr

Benutzeravatar von RiaD
RiaD

Es bedeutet Typ. size_t ist der Größentyp.

1427210cookie-checkWas stellt ein Typ gefolgt von _t (Unterstrich-t) dar?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy