variable Was repräsentiert ein Typ, gefolgt von_t(Unterstrich-t)?




variable naming conventions (8)

Das scheint eine einfache Frage zu sein, aber ich kann es nicht mit der Stack Overflow Suche oder Google finden. Was bedeutet ein Typ, gefolgt von einem _t ? Sowie

int_t anInt;

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


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


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


Das _t hat von Natur aus keine besondere Bedeutung. Es ist jedoch üblich geworden, das Suffix _t zu typedef hinzuzufügen.

Sie sind vielleicht vertrauter mit gängigen C-Praktiken zur Variablenbenennung ... Das ist ähnlich wie es üblich ist, p an der Vorderseite für einen Zeiger zu halten und einen Unterstrich vor globalen Variablen zu verwenden (das ist etwas weniger üblich) und die Variablennamen i , j und k für temporäre Schleifenvariablen zu verwenden.

In Code, wo Wortgröße und Reihenfolge wichtig ist, ist es sehr üblich benutzerdefinierte Typen zu verwenden, die explizit sind, wie BYTE WORD (normalerweise 16-Bit) DWORD (32-Bit).

int_t ist nicht so gut, weil die Definition von int zwischen Plattformen variiert - also wessen int int_t Sie an? (Obwohl die meiste PC-zentrische Entwicklung es heutzutage als 32 Bits behandelt, behandeln viele Dinge für die Nicht-PC-Entwicklung int weiterhin als 16 Bits).


Es bedeutet Typ. size_t ist der size_t .


Das _t normalerweise eine opake Typdefinition.

GCC fügt nur Namen, die mit _t zu dem reservierten Namespace hinzu, den Sie nicht verwenden dürfen, um Konflikte mit zukünftigen Versionen von Standard C und POSIX (Handbuch der GNU C-Bibliothek) zu vermeiden. Nach einigen Nachforschungen fand ich endlich die richtige Referenz im POSIX Standard (1003.1, Rational (Informativ)):

B.2.12 Datentypen

Die Anforderung, dass weitere in diesem Abschnitt definierte Typen in "_t" enden, wurde durch das Problem der Namensraumverschmutzung verursacht. Es ist schwierig, einen Typ (wo dieser Typ nicht durch IEEE Std 1003.1-2001 definiert ist) in einer Header-Datei zu definieren und ihn in einem anderen zu verwenden, ohne dem Namensraum des Programms Symbole hinzuzufügen. Damit die Implementierer ihre eigenen Typen bereitstellen können, müssen alle entsprechenden Anwendungen Symbole vermeiden, die auf "_t" enden, wodurch der Implementierer zusätzliche Typen bereitstellen kann. Da bei der Definition von Strukturelementen, die in den in IEEE Std. 1003.1-2001 definierten Strukturen (und in vielen Fällen) hinzugefügt werden können, eine größere Verwendung von Typen besteht, ist die Notwendigkeit zusätzlicher Typen zwingend.

_t gesagt, der Standard sagt, dass es gute Chancen gibt, die Liste der Standardtypen zu erweitern, daher beschränkt der Standard den Namensraum _t für seine eigene Verwendung.

Zum Beispiel entspricht Ihr Programm POSIX 1003.1 Issues 6 und Sie haben einen Typ foo_t definiert. POSIX 1003.1 Issues 7 wird schließlich mit einem neuen definierten Typ foo_t . Ihr Programm stimmt nicht mit der neuen Version überein, was ein Problem sein könnte. Die Beschränkung der Verwendung von _t verhindert eine _t des Codes. Wenn Sie also eine POSIX-Konformität _t , sollten Sie das _t unbedingt vermeiden, wie es der Standard angibt.

Randnotiz: Ich persönlich versuche, bei POSIX zu bleiben, weil ich denke, dass es gute Grundlagen für eine saubere Programmierung gibt. Außerdem mag ich Linux-Coding-Style- Richtlinien (Kapitel 5) . Es gibt einige gute Gründe dafür, warum Sie typedef nicht verwenden. Ich hoffe das hilft!


Wenn Sie mit dem Code der Hardwareschnittstelle arbeiten, hat der Autor des von Ihnen betrachteten Codes möglicherweise int_t als Ganzzahl mit einer bestimmten Größe definiert. Der C-Standard weist dem int Typ keine bestimmte Größe zu (dies hängt möglicherweise von Ihrem Compiler und der Zielplattform ab), und die Verwendung eines bestimmten int_t Typs würde dieses Portabilitätsproblem vermeiden.

Dies ist eine besonders wichtige Überlegung für den Hardware-Schnittstellencode, weshalb Sie die Konvention zum ersten Mal bemerkt haben.


Es ist nur eine Konvention, die "Typ" bedeutet. Es bedeutet nichts Besonderes für den Compiler.


Wie Douglas Mayle bemerkte, bezeichnet er im Grunde einen Typennamen. Folglich wären Sie nicht in der _t , Variablen- oder Funktionsnamen mit " _t " zu _t , da dies zu Verwirrung führen könnte. Neben size_t definiert 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 uintptr_t , intmax_t , int8_t , uint_least16_t , uint_fast32_t und so weiter. Diese neuen Typen sind formal in <stdint.h> aber meistens werden Sie <inttypes.h> was (ungewöhnlich für Standard-C-Header) <stdint.h> einschließt. Es ( <inttypes.h> ) definiert auch Makros für die Verwendung mit printf() und scanf() .

Wie Matt Curtis bemerkte, hat der Compiler im Suffix keine Bedeutung; es ist eine menschenorientierte Konvention.

Sie sollten jedoch auch beachten, dass POSIX viele zusätzliche _t Endung ' _t ' definiert und das Suffix für die Implementierung reserviert. Das heißt, wenn Sie an POSIX-bezogenen Systemen arbeiten, ist es nicht ratsam, eigene 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 überrascht, die Typen definieren, die den gleichen Namen haben, den wir definieren.


Dies ist eine Standardbenennungskonvention für Datentypen, die normalerweise von typedefs definiert werden. Ein großer Teil des C-Codes, der sich mit Hardware-Registern befasst, verwendet C99-definierte Standardnamen für vorzeichenbehaftete und vorzeichenlose Datentypen fester Größe. Als Konvention sind diese Namen in einer Standard-Header-Datei (stdint.h) und enden mit _t.





types