Forum: Mikrocontroller und Digitale Elektronik Enum oder defines?


von Mike (Gast)


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

von Rolf M. (rmagnus)


Lesenswert?

In C ist es weitgehend egal. In C++ würde ich enum (oder enum class) 
verwenden, weil da die Typprüfung strenger ist und weil sich enums dort 
an Namespaces halten.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Nop (Gast)


Lesenswert?

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.

von Bauform B. (bauformb)


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!

von Fragen ueber Fragen (Gast)


Lesenswert?

Bauform B. schrieb:
> static const char   bga_letters[] = "ABCDEFGHJKLMNPRTUVWY";
> static const int  AFMAX = 16;

Und wie geht das in einem header???

von Bauform B. (bauformb)


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);

von Fragen ueber Fragen (Gast)


Lesenswert?

Bauform B. schrieb:
> typedef enum temperature_enum {
>    T_UNDEF,                     // keine Daten
> ...

Mmmh, was hat das Ganze mit "Aufzählung" zu tun?
Für mich ist das eine Paradebeispiel für ein #define.

von Bauform B. (bauformb)


Lesenswert?

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?

von Fragen ueber Fragen (Gast)


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. 
;-)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Fragen ueber Fragen schrieb:
> Deine Aufgabenstellung sieht nach einer Nachschlagtabelle aus.

Wo siehst Du das?

Und - wo würde ein #define daran irgendwas verändern?

Bevor Du "Schmutz" unterstellst, solltest Du vielleicht besser 
verstehen, was Du da versuchst, zu beurteilen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.