Enum oder defines?

Gast #5606600
Hi,
was ist vorteilhafter von enums oder defines? Oder ist es sogar egal?
z.B.
1
enum Tage
2
{
3
Sonntag=1,
4
Montag,
5
Dienstag,
6
Mittwoch,
7
Donnerstag,
8
Freitag,
9
Samstag
10
}
1
#define Sonntag 1
2
#define Montag 2
3
#define Dienstag 3
4
#define Mittwoch 4
5
#define Donnerstag 5
6
#define Freitag 6
7
#define Samstag 7
Persönliche Seite
Enums haben den Vorzug, daß man sich nicht um die Verwaltung der 
dahintersteckenden numerischen Werte kümmern muss, und daß Doppelungen 
(zwei verschiedene Namen für den gleichen Wert) ausgeschlossen sind.

Damit sind sie einfachem Textersatz durch #defines auch in normalem 
deutlich überlegen.

Man muss sich halt im klaren über die Einschränkungen sein, enums sind 
in C eine sehr primitive Kiste und als Datentyp weitestgehend 
unbrauchbar, zumal sie eben alle im selben Namensraum liegen.

Damit ist es unmöglich, in zwei verschiedenen Enums den gleichen Namen 
zu verwenden.

Sie sind aber als strukturierendes Element zu gebrauchen (das in erster 
Linie der Quelltextdokumentation dient), d.h. man weiß, welche Werte 
logisch zusammengehören, was bei #defines nur von der Disziplin des 
Quelltextschreibers abhängt, und sie haben, wie schon erwähnt, den 
Vorzug der Doublettenvermeidung.
Gast
Mike schrieb:

> was ist vorteilhafter von enums oder defines?

enums, wenn Du etwas aufzählst (enumeration = Aufzählung). Defines, wenn 
der isolierte Wert so und nicht anders zu sein hat, z.B. Bitmasken oder 
Register-Adressen.
Ein #define aus einem fremden *.h hat hier mal heimlich Textersatz in 
meinem Programm gemacht, ein sehr schöner Fehler. Seit dem gibt es 
#define nur noch, um komplizierte Initialisierungen schöner schreiben zu 
können. In C ist "const" zwar nicht soo toll, aber immer noch besser als 
#define.
1
static const char   bga_letters[] = "ABCDEFGHJKLMNPRTUVWY";
2
static const int  AFMAX = 16;

enum missbrauche ich auch für Bitmasken; jede Fehlermeldung vom Compiler 
hilft!
meinst du sowas?
1
// temperature.h
2
#pragma once
3

4
// Temperatur Bits, allgemein sind Temperaturen int32_t;
5
// uint16_t könnte auch reichen, auch für TEGs und Abgas, nicht für Flammrohr
6

7
static const int T_F_MUL = 50;  // diese sollen für die Anzeige durch 10
8
static const int T_C_MUL = 90;  // teilbar sein. Sie sollen gross genug sein,
9
                                // dass 0.1K darstellbar und größer
10
                                // als TEMP_OPEN ist
11
typedef enum temperature_enum {
12
   T_UNDEF,                     // keine Daten
13
   T_SHORT,                     // Kurzschlusß, gemessen
14
   T_OPEN,                      // Offen, gemessen
15
   T_05K      =   90 / 2,       // 0.5 Kelvin
16
   T_1K       =   1 * 90,
17
   T_2K       =   2 * 90,
18
   T_3K       =   3 * 90,
19
   T_5K       =   5 * 90,
20
   T_17K      =  17 * 90,
21
// TEMP_200K  =    18000,       // -99.67°F = -73.15°C
22
//            =    20970,       // -40.27°F = -40.15°C
23
   T_ABSMIN   =    20984,       // -40.00°F = -40.00°C
24
   T_0F       =    22984,       // 459.67 * 50 = -17.7778°C
25
   T_0C       =    24584,       // 273.15 * 90  (Fehler < 0.006K)
26
   T_25C      =  25 * 90 + T_0C,
27
   T_40C      =  40 * 90 + T_0C,
28
   T_60C      =  60 * 90 + T_0C,
29
   T_75C      =  75 * 90 + T_0C,
30
   T_ABSMAX   =  90 * 90 + T_0C,
31
//              32767           //  90.9°C
32
//              33578           //   100°C = 212°F
33
//              65535           //   455°C = 851°F = 728.2K
34
//             301784           // Wasserstoff/Sauerstoff-Flamme <= 3080°C
35
} temperature_enum;
36

37
static inline int C_(int T) { return T * T_C_MUL + T_0C; }
38
static inline int F_(int T) { return T * T_F_MUL + T_0F; }
39
static inline int K_(int T) { return T * T_C_MUL; }
40

41
int  print_temp (int unit, int kelvins);
naja, es ist eine Aufzählung von Konstanten, die alle etwas mit 
Temperaturen zu haben, nur ausnahmsweise nicht lückenlos von 0 bis n. Es 
mag unmoralisch sein, aber es ist nicht verboten und es macht nicht dick 
;)
Was könnte #define an dieser Stelle besser?
Gast
So nebenbei:
da du schon das unbekannte T_0C verwendest, kannst du die 90 auch 
gegen dein "define" T_C_MUL ersetzen. ;-)

und zur Frage:
Bei deinen Berechnungen darf es bei den Werte keine Dopplung geben. 
Keine Ahnung, ob das nicht Überüberübermorgen passieren kann. Deine 
Aufgabenstellung sieht nach einer Nachschlagtabelle aus. Damit 
Überüberübermorgen Dritte dein Programm verstehen können, sllte die 
Lösung nahe der Problemstellung sein.

C erlaubt leider jede Menge Schmutz. Und das ist auch ein Grund für 
mangelnde Produktqualität. Du zeigst uns wieder eine Parade-Beispiel. 
;-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.