Enum oder defines?

Gast #5606600
Lesenswert?

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 #5606632
Lesenswert?

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.
#5606718
Lesenswert?

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!
#5606906
Lesenswert?

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);
Gast #5606948
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren