5 Stimmen

GCC/Clang/MSVC-Erweiterung für die Angabe der C-Enum-Größe?

Gibt es eine Erweiterungsfunktion zur Angabe der Größe von C enum für jeden Compiler?

  • GCC
  • Clang
  • MSVC

2voto

Travis Gockel Punkte 25964

Mit GCC können Sie die genaue Länge nicht angeben, aber Sie können die kürzest mögliche Länge mit -fshort-enums . Beispiel:

#include <stdio.h>

typedef enum
{
    f1, f2
} foo;

int main()
{
    printf("%i\n", sizeof(foo));
    return 0;
}

Kompilieren:

gcc program.c -fshort-enums

Ausgabe:

1

Wenn Sie jedoch einen Link auf etwas setzen wollen, müssen Sie sicherstellen, dass derjenige, der sich Ihre Kopfzeilen ansieht, auch die -fshort-enums oder es ist nicht ABI-konform (und Sie werden einige wirklich lustige Fehler sehen).

1voto

Necrolis Punkte 25132

C++11 hat eine standardisierte Methode dafür eingeführt, aber da es sich um C handelt, müssen Sie sich mit einer einfacheren Methode begnügen, indem Sie die letzte enum INT_MAX oder einen Wert, der groß genug ist, dass nur der gewünschte Typ ihn aufnehmen kann (so macht es das DirectX SDK). Leider gibt es keine Möglichkeit, eine maximale Größe zu erzwingen (zumindest nicht ohne compilerspezifische Erweiterungen).

1voto

Mecki Punkte 113876

Mit clang können Sie dies verwenden:

enum Tristate : char { Yes, No, Maybe };

Wenn Sie möchten, dass typedef stellen Sie sicher, dass Sie den Größenbezeichner für beide, die enum und die typedef Definition:

enum Tristate : char { Yes, No, Maybe };
typedef enum Tristate : char Tristate;

Andernfalls erhalten Sie eine Compiler-Warnung.

Oder Sie definieren eine anonyme enum y typedef direkt:

typdef enum : char { Yes, No, Maybe } Tristate;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X