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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Frank (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert

von Frank (Gast)


Bewertung
0 lesenswert
nicht lesenswert
OK, danke euch. Ich werde mir die Links mal zugute tun

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.