Forum: PC-Programmierung static const oder define in c-Datei


von Frank (Gast)


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?

von Dr. Sommer (Gast)


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.

von Stefan S. (mexakin)


Lesenswert?


von Frank (Gast)


Lesenswert?

OK, danke euch. Ich werde mir die Links mal zugute tun

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.