Warum enum verwenden, wenn #define genauso effizient ist? [duplicate]

Lesezeit: 2 Minuten

Ein Enum funktioniert also so:

enum {
  false,
  true
}

was äquivalent ist

int false = 0
int true = 1

Warum würde ich nicht ersetzen enum mit #define?

#define FALSE 0
#define TRUE 1

Für mich scheinen sie austauschbar zu sein. Das ist mir bewusst #define kann mit Argumenten umgehen, arbeitet also ganz anders als enum. Was genau sind die Hauptverwendungen von enum wenn wir haben #define in diesem Fall?

Wenn ich raten sollte, wie die #define ist eine Präprozessorfunktion, enum hätte einige Laufzeitvorteile. Wie weit bin ich weg?

Danke im Voraus.

  • siehe stackoverflow.com/questions/136946/…

    – SirDarius

    9. März 2011 um 8:56 Uhr

  • Seltsam, dass dieser nicht in meinen Suchergebnissen auftauchte. Vielen Dank!

    – Benutzernummer

    9. März 2011 um 9:02 Uhr


  • Es ist nicht gleichbedeutend mit int false = 0 noch zu int const false = 0 (was angemessener wäre). int Variablen hätten eine Adresse, das könnte man dann machen &falsewas Sie nicht können enum.

    – Jens Gustedt

    9. März 2011 um 10:40 Uhr

  • Beachten Sie, dass SO 136946 sowohl mit C++ als auch mit C gekennzeichnet ist. Nominell ist es keine so gute Wahl für Duplikate wie SO 1674032, das nur für C gilt, aber ich könnte vom Gegenteil überzeugt werden.

    – Jonathan Leffler

    30. November 2015 um 23:47 Uhr


  • Es ist lustig, dass ich diese Frage gefunden habe, während ich mich genau das Gegenteil gefragt habe: Warum verwenden C-Programmierer #definess statt enums.

    – Hallo Engel

    17. November 2018 um 9:08 Uhr

Benutzer-Avatar
jcomeau_ictx

Die Vorteile von enum erscheinen, wenn Sie eine lange Liste von Dingen haben, die Sie Zahlen zuordnen möchten, und Sie in der Lage sein möchten, etwas in die Mitte dieser Liste einzufügen. Sie haben zum Beispiel:

pears 0
apples 1
oranges 2
grapes 3
peaches 4
apricots 5

Jetzt wollen Sie setzen tangerines nach oranges. Mit #defines, müssten Sie die Zahlen von neu definieren grapes, peachesund apricots. Mit enum würde es automatisch passieren. Ja, das ist ein erfundenes Beispiel, aber hoffentlich gibt es Ihnen die Idee.

  • Ja, jetzt sehe ich den Unterschied. Vielen Dank!

    – Benutzernummer

    9. März 2011 um 9:06 Uhr

  • Dies ist eine gute Antwort. Aber setzt voraus der Leser (der jeder NOOB sein könnte) weiß, dass sie ein deklarieren kann enum mit pears 0 und den Rest NICHT nummerieren.

    – Gideon

    25. November 2014 um 3:04 Uhr


Ich finde es nützlich zum Debuggen in einer Umgebung wie gdb, da Enum-Werte zur Kompilierzeit verarbeitet werden (wobei #define ein Präprozessor-Makro ist) und somit für die Selbstprüfung verfügbar sind.

Benutzer-Avatar
Lindydancer

Obwohl Ihre Frage als C gekennzeichnet ist, gibt es beim Schreiben in C++ einen großen Vorteil, den Sie platzieren können enum:s innerhalb von Klassen oder Namespaces.

Auf diese Weise könnten Sie auf Ihre Konstanten wie verweisen SpaceshipClass::galaxy.

enum ist eine ganzzahlige Konstante. Es würde also während des Kompilierungsprozesses eine Typprüfung geben.

1186490cookie-checkWarum enum verwenden, wenn #define genauso effizient ist? [duplicate]

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

Privacy policy