Dies scheint eine einfache Frage zu sein, aber ich kann sie mit der Stapelüberlaufsuche oder Google nicht finden. Was bedeutet ein Typ, gefolgt von einem _t
Mittelwert? Sowie
int_t anInt;
Ich sehe es oft in C-Code, der eng mit Hardware umgehen soll - ich kann nicht anders, als zu glauben, dass sie verwandt sind.
c
naming-conventions
types
Kevin Griffin
quelle
quelle
int_t
definiert? Wenn es immer definiert ist alsint
, ist es nicht nützlich; Es ist viel klarer,int
direkt zu verwenden . Wenn es nicht immer definiert ist alsint
(sagen wir, ob es sein könntelong int
odershort int
), dann ist es ein schlecht gewählter und verwirrender Name.Antworten:
Wie Douglas Mayle bemerkte, bezeichnet es im Grunde einen Typnamen. Infolgedessen wäre es nicht ratsam, Variablen- oder Funktionsnamen mit '
_t
' zu beenden , da dies zu Verwirrung führen könnte. Nebensize_t
, die C89 - Standard definiertwchar_t
,off_t
,ptrdiff_t
und wahrscheinlich einige andere habe ich vergessen. Der C99 - Standard definiert eine Menge von zusätzlichen Typen, wieuintptr_t
,intmax_t
,int8_t
,uint_least16_t
,uint_fast32_t
, und so weiter. Diese neuen Typen werden formal in definiert,<stdint.h>
aber meistens verwenden Sie<inttypes.h>
welche (ungewöhnlich für Standard-C-Header)<stdint.h>
. Es (<inttypes.h>
) definiert auch Makros zur Verwendung mitprintf()
undscanf()
.Wie Matt Curtis bemerkte, hat der Compiler im Suffix keine Bedeutung. Es ist eine menschenorientierte Konvention.
Beachten Sie jedoch auch, dass POSIX viele zusätzliche Typnamen definiert, die mit '
_t
' enden , und das Suffix für die Implementierung reserviert . Das heißt, wenn Sie an POSIX-bezogenen Systemen arbeiten, ist es nicht ratsam, Ihre eigenen Typnamen mit der Konvention zu definieren. Das System, an dem ich arbeite, hat es geschafft (seit mehr als 20 Jahren); Wir werden regelmäßig von Systemen gestolpert, die Typen mit demselben Namen definieren, den wir definieren.quelle
abbr_xxxxx_t
. Ohne ein solches Präfix können Sie jederzeit erwischt werden. Im Allgemeinen verwenden die standardisierten_t
Typen alle Kleinbuchstaben (FILE
und esDIR
gibt zwei Ausnahmen, zweimal - alle Großbuchstaben und nein_t
), sodass Sie sieCamelCase_t
mit mäßiger Sicherheit mit oder ohne die führenden Großbuchstaben verwenden können. Das System, an dem ich hauptsächlich arbeite, neigt dazu, gefährlich zu leben und es_t
trotzdem zu benutzen , aber es hat uns gelegentlich gebissen. Ich neige dazu,CamelCase
ohne Suffix für meine eigene Arbeit zu verwenden; Meine Funktionen sind normalerweise alle in Kleinbuchstaben.Es ist eine Konvention zum Benennen von Datentypen, z. B
typedef
.:quelle
Das
_t
umschließt normalerweise eine undurchsichtige Typdefinition.GCC fügt lediglich Namen hinzu, die mit
_t
dem reservierten Namespace enden , den Sie möglicherweise nicht verwenden, um Konflikte mit zukünftigen Versionen von Standard C und POSIX (GNU C-Bibliothekshandbuch) zu vermeiden . Nach einigen Recherchen fand ich schließlich die richtige Referenz im POSIX-Standard (1003.1, Begründung (informativ)):Kurz gesagt, der Standard sagt, dass es gute Chancen gibt, die Liste der Standardtypen zu erweitern, daher beschränkt der Standard den
_t
Namespace für seine eigene Verwendung.Zum Beispiel stimmt Ihr Programm mit POSIX 1003.1 Issues 6 überein und Sie haben einen Typ definiert
foo_t
. POSIX 1003.1 Issues 7 wird schließlich mit einem neu definierten Typ veröffentlichtfoo_t
. Ihr Programm stimmt nicht mit der neuen Version überein, was möglicherweise ein Problem darstellt. Durch die Einschränkung der_t
Verwendung wird 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.Randnotiz: Ich persönlich versuche, mich an POSIX zu halten, weil ich denke, dass es gute Grundlagen für eine saubere Programmierung bietet. Darüber hinaus mag ich die Richtlinien für Linux Coding Style (Kapitel 5) sehr gern . Es gibt einige gute Gründe, warum Sie nicht typedef verwenden. Ich hoffe das hilft!
quelle
Es ist eine Standard-Namenskonvention für Datentypen, die normalerweise durch typedefs definiert wird. Viele C-Codes, die sich mit Hardwareregistern befassen, verwenden C99-definierte Standardnamen für vorzeichenbehaftete und vorzeichenlose Datentypen mit fester Größe. Konventionell befinden sich diese Namen in einer Standard-Header-Datei (stdint.h) und enden mit _t.
quelle
Es ist nur eine Konvention, die "Typ" bedeutet. Für den Compiler bedeutet dies nichts Besonderes.
quelle
Das
_t
hat von Natur aus keine besondere Bedeutung. Es ist jedoch üblich geworden, das_t
Suffix zu typedefs hinzuzufügen .Möglicherweise sind Sie mit den gängigen C-Praktiken für die Benennung von Variablen besser vertraut. Dies ähnelt der üblichen Vorgehensweise, bei einem Zeiger an der Vorderseite zu bleiben und einen Unterstrich vor globalen Variablen zu verwenden (dies ist etwas seltener). und die Variablennamen zu verwenden
i
,j
undk
für temporäre Schleifenvariablen.In Code, in dem Wortgröße und Reihenfolge wichtig sind, werden häufig benutzerdefinierte Typen verwendet, die explizit sind, z. B.
BYTE
WORD
(normalerweise 16 Bit)DWORD
(32 Bit).int_t
ist nicht so gut, weil die Definition vonint
zwischen den Plattformen variiert - also wemint
entsprechen Sie? (Obwohl heutzutage die meisten PC-zentrierten Entwicklungen es als 32 Bit behandeln, behandeln viele Dinge für die Nicht-PC-Entwicklung Ints immer noch als 16 Bit).quelle
Es bedeutet Typ.
size_t
ist der Größentyp.quelle
Es gab einige gute Erklärungen zu diesem 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 zwischen verschiedenen Plattformen (dh Hardwaretyp-Compilern) zu verbessern.
Ein weiterer Grund besteht darin, Ihren Code auf verschiedene Betriebssysteme portierbar zu machen und Kollisionen mit vorhandenen Typen im Betriebssystem zu vermeiden, die Sie in Ihren Code integrieren. Hierzu wird normalerweise ein eindeutiges (möglichst) Präfix hinzugefügt.
Beispiel:
quelle
Wenn Sie mit Hardware-Schnittstellencode arbeiten, hat der Autor des Codes, den Sie betrachten, möglicherweise
int_t
eine bestimmte Ganzzahl definiert. Der C-Standard weist demint
Typ keine bestimmte Größe zu (dies hängt möglicherweise von Ihrem Compiler und Ihrer Zielplattform ab), und die Verwendung eines bestimmtenint_t
Typs würde dieses Portabilitätsproblem vermeiden.Dies ist eine besonders wichtige Überlegung für den Code der Hardwareschnittstelle, weshalb Sie möglicherweise die Konvention dort zum ersten Mal bemerkt haben.
quelle
Zum Beispiel in C99 /usr/include/stdint.h:
_t
bedeutet immer definiert durch typedef.quelle