Best Practices: Soll ich eine Typedef für Byte in C oder C++ erstellen?

Lesezeit: 5 Minuten

Benutzer-Avatar
Dan O

Siehst du dir lieber sowas an t_byte* (mit typedef unsigned char t_byte) oder unsigned char* in Code?

Ich tendiere zu t_byte in meinen eigenen Bibliotheken, habe aber noch nie an einem großen Projekt gearbeitet, bei dem dieser Ansatz verfolgt wurde, und wundere mich über Fallstricke.

Benutzer-Avatar
Warren Jung

Wenn Sie C99 oder neuer verwenden, sollten Sie verwenden stdint.h dafür. uint8_tin diesem Fall.

C++ hat diesen Header erst in C++11 erhalten und ihn aufgerufen cstdint. Alte Versionen von Visual C++ erlaubten Ihnen nicht, C99 zu verwenden stdint.h in C++-Code, aber so ziemlich jeder andere C++98-Compiler hat dies getan, sodass Sie diese Option möglicherweise auch dann haben, wenn Sie alte Compiler verwenden.

Wie bei so vielen anderen Dingen, Schub Papiere über diesen Unterschied in boost/integer.hppBereitstellung von Dingen wie uint8_t wenn die Standard-C++-Bibliothek Ihres Compilers dies nicht tut.

Benutzer-Avatar
Clifford

Ich schlage vor, dass, wenn Ihr Compiler dies unterstützt, die C99 <stdint.h> Header-Typen wie z uint8_t und int8_t.

Wenn Ihr Compiler es nicht unterstützt, erstellen Sie eines. Hier ist ein Beispiel für VC++ältere Versionen davon nicht stdint.h. GCC unterstützt stdint.hund zwar die meisten C99

Ein Problem mit Ihrem Vorschlag ist, dass das Zeichen von char ist die Implementierung definiert, wenn Sie also einen Typalias erstellen. Sie sollten zumindest das Zeichen deutlich machen. Die Idee hat seit in einen gewissen Wert C# zum Beispiel ein char ist 16bit. Aber es hat auch einen Byte-Typ.


Zusätzliche Anmerkung…

Es gab kein Problem mit Ihrem Vorschlag, Sie haben tatsächlich unsigniert angegeben.

Das würde ich auch schlicht vorschlagen char wird verwendet, wenn es sich bei den Daten tatsächlich um Zeichendaten handelt, dh um eine Darstellung von Klartext, wie Sie ihn möglicherweise auf einer Konsole anzeigen. Dies führt zu weniger Problemen mit Typvereinbarungen, wenn Standardbibliotheken und Bibliotheken von Drittanbietern verwendet werden. Wenn die Daten andererseits eine Nicht-Zeichen-Entität darstellen, wie z stdint.h Typen (oder sogar ein von ihnen definierter Typ) verwendet werden.

Ich wurde kürzlich von einem erwischt TI C54xx Compiler wo char ist in der Tat 16bit, deshalb verwenden wir stdint.h wo möglich, auch wenn Sie es verwenden, um dann a zu definieren byte Typ ist besser als davon auszugehen unsigned char ist ein passender Alias.

  • Guter Punkt zu meinem Beispiel, ich habe Warrens Antwort richtig markiert, weil er der Erste war und sein Beitrag prägnant war. Hat dich zumindest hochgestuft…

    – Dan O

    11. September 2009 um 7:37 Uhr

Ich bevorzuge es, wenn Typen die Bedeutung der darin gespeicherten Werte vermitteln. Wenn ich einen Typ benötige, der ein Byte beschreibt, wie es auf meiner Maschine ist, bevorzuge ich es sehr byte_t Über unsigned char, was so ziemlich alles bedeuten kann. (Ich habe in einer Codebasis gearbeitet, die beide verwendet hat signed char oder unsigned char um UTF-8-Strings zu speichern.) Dasselbe gilt für uint8_t. Es könnte einfach so verwendet werden: eine 8-Bit-Ganzzahl ohne Vorzeichen.

Mit byte_t (wie bei jedem anderen treffend benannten Typ) besteht selten die Notwendigkeit, nachzuschlagen, wofür er definiert ist (und wenn ja, braucht ein guter Editor 3 Sekunden, um ihn für Sie nachzuschlagen; vielleicht 10 Sekunden, wenn die Codebasis es ist riesig), und schon beim Hinsehen ist klar, was in solchen Objekten gespeichert ist.

Benutzer-Avatar
Kirill V. Ljadwinski

Ich persönlich bevorzuge boost::int8_t und boost::uint8_t.

Wenn Sie Boost nicht verwenden möchten, können Sie es ausleihen boost\cstdint.hpp.

Eine weitere Option ist die Verwendung portable Version von stdint.h (Link von dieser Antwort).

Abgesehen von Ihrer umständlichen Namenskonvention denke ich, dass das in Ordnung sein könnte. Denken Sie daran, dass boost dies für Sie erledigt, um die Cross-Plattform-Fähigkeit zu unterstützen:

#include <boost/integer.hpp>

typedef boost::uint8_t byte_t;

Beachten Sie, dass Typen normalerweise mit angehängt werden _twie in byte_t.

  • Typen, die Sie definieren, sollten NICHT mit dem Suffix „_t“ versehen werden, da solche Namen für Erweiterungen der Sprache und der Standardbibliotheken reserviert sind (z. B. damit das Hinzufügen von uint8_t nicht viel vorhandenen Code beschädigt).

    – Messstab

    11. September 2009 um 11:57 Uhr

  • @chrisharris wo hast du diese info gefunden? Ich schaue gerade einen Entwurf der ISO-C++-Standards durch und kann diesen Abschnitt nicht finden, aber ich habe einen Kollegen, der gerne alle seine Klassen-/Funktionsvorlagen auf diese Weise anhängt und ihn darauf hinweisen möchte.

    – stinkig472

    1. Juli 2010 um 7:26 Uhr

  • @stinky472: Ich habe keine Ahnung, was der ISO C-Standard dazu sagt, aber der gesunde Menschenverstand sagt, dass benutzerdefinierte Namen nicht mit Standardnamen kollidieren sollten, also ist es besser, sie zu verwenden, um Probleme zu vermeiden byte. Oder, wenn Ihr Kollege es vorzieht, verwenden Sie a Präfix statt Suffix: t_byte.

    – MestreLion

    16. Februar 2015 um 5:38 Uhr

Benutzer-Avatar
Missaka Wijekoon

Ich bevorzuge die Verwendung von Standardtypen, unsigned char, uint8_t usw., sodass Programmierer, die sich die Quelle ansehen, nicht auf Header zurückgreifen müssen, um den Code zu groken. Je mehr Typedefs Sie verwenden, desto länger dauert es, bis andere Ihre Schreibkonventionen kennenlernen. Verwenden Sie für Strukturen unbedingt Typedefs, aber für Primitiven verwenden Sie sie sparsam.

  • Typen, die Sie definieren, sollten NICHT mit dem Suffix „_t“ versehen werden, da solche Namen für Erweiterungen der Sprache und der Standardbibliotheken reserviert sind (z. B. damit das Hinzufügen von uint8_t nicht viel vorhandenen Code beschädigt).

    – Messstab

    11. September 2009 um 11:57 Uhr

  • @chrisharris wo hast du diese info gefunden? Ich schaue gerade einen Entwurf der ISO-C++-Standards durch und kann diesen Abschnitt nicht finden, aber ich habe einen Kollegen, der gerne alle seine Klassen-/Funktionsvorlagen auf diese Weise anhängt und ihn darauf hinweisen möchte.

    – stinkig472

    1. Juli 2010 um 7:26 Uhr

  • @stinky472: Ich habe keine Ahnung, was der ISO C-Standard dazu sagt, aber der gesunde Menschenverstand sagt, dass benutzerdefinierte Namen nicht mit Standardnamen kollidieren sollten, also ist es besser, sie zu verwenden, um Probleme zu vermeiden byte. Oder, wenn Ihr Kollege es vorzieht, verwenden Sie a Präfix statt Suffix: t_byte.

    – MestreLion

    16. Februar 2015 um 5:38 Uhr

1245580cookie-checkBest Practices: Soll ich eine Typedef für Byte in C oder C++ erstellen?

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

Privacy policy