static const oder define in c-Datei

Gast #5779272
Lesenswert?
• ▲
▼
Hallo,
wann verwendet man für einen festen wert ein define und wann einen 
static const?
Ich habe gerade einen Code vor mir liegen, wo die länge der Daten mit
1
static const uint16 numberOfBlocks = 4095;
Das ist direkt am Anfang der Datei deklariert, also für die ganze Datei 
sichtbar. Warum würde man das nicht z.B. als define machen?
1
#define numberOfBlocks  4095
die Wirkung wäre doch die selbe oder nicht?
Gast #5779284
Lesenswert?
• ▲
▼
Frank schrieb:
> Warum würde man das nicht z.B. als define machen?

Makros ("#define") sollte man grundsätzlich so wenig wie möglich 
verwenden, da sie diverse Probleme haben (globaler Scope, kein Typ, 
keine Referenz möglich). "static const" hat diese Probleme nicht. Leider 
sind Konstanten in C nur "read-only Variablen", somit kann man einen 
solchen Wert z.B. nicht für Array-Größen oder als Wert für weitere 
Konstanten verwenden. Dann muss man ein Makro nutzen.
In C++ hingegen ist "static const" eine echte Konstante und sollte wann 
immer möglich gegenüber Makros bevorzugt werden. Noch besser ist "static 
constexpr".

Frank schrieb:
> die Wirkung wäre doch die selbe oder nicht?
Leider nein. Ein Makro ist nur eine primitive Textersetzung. Eine 
Konstante ist ein Sprachelement. Mit einem Makro geht nicht:
1
fwrite (&numberOfBlocks, sizeof (numberOfBlocks), 1, file);
Dies führt zu Problemen
1
void foo (void) { int numberOfBlocks = 42; }
und bei überladenen Funktionen oder templates ist unklar was jetzt genau 
bei "foo(numberOfBlocks)" passiert, da der Typ von "numberOfBlocks" nur 
implizit ist (hier: int). Bei "static const" sieht das anders aus.

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