style - variable naming conventions




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

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.


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).


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!


Es bedeutet Typ. size_t ist der size_t .


Es gab ein paar gute Erklärungen zu dem Thema. Nur um einen weiteren Grund für die Neudefinition der Typen hinzuzufügen:

In vielen eingebetteten Projekten werden alle Typen neu definiert, um die angegebene Größe für die Typen korrekt anzugeben und die Portabilität über verschiedene Plattformen (z. B. Compiler für Hardwaretypen) zu verbessern.

Ein weiterer Grund besteht darin, Ihren Code über verschiedene Betriebssysteme portierbar zu machen und Kollisionen mit vorhandenen Typen im Betriebssystem zu vermeiden, die Sie in Ihren Code integrieren. Dazu wird normalerweise ein eindeutiges (wie möglich) Präfix hinzugefügt.

Beispiel:

typedef unsigned long dc_uint32_t;

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


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.





types