mikrocontroller.net

Forum: Compiler & IDEs const oder define für feste Variablen


Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo...

Was kann man für fixe Variablen besser einsetzen, const oder define ?
Oder wo genau liegt der Unterschied ?

Ich habe mal gehört, dass const besser wäre als define!

FG Bernd

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd wrote:
> Hallo...
>
> Was kann man für fixe Variablen besser einsetzen, const oder define ?
> Oder wo genau liegt der Unterschied ?
>
> Ich habe mal gehört, dass const besser wäre als define!

Beide machen unterschiedliche Dinge.

const
  vereinbart eine Variable, deren Wert konstant ist, sich also
  nach der Initialisierung nicht mehr ändert. Der Compiler
  kann dieses Wissen über die Konstantheit benutzen um
  damit Optimierungen durchzuführen und es ist nicht ungewöhnlich
  das eine derartige const Variable(Ausnahme: Strings) im
  fertigen Programm nicht mehr als Variable auftaucht und
  daher auch keinen Speicher verbraucht.

  Aber ansonsten ist das eine Variable wie jede andere auch:
  * Sie hat einen Datentyp
  * Sie hat eine Speicheradresse
  * Da das eine Variable wie jede andere auch ist, taucht
    sie auch in Werkzeugen, wie zb. Debugger, auf

#define
  Das hat zunächst mal mit konstanten Werten an sich überhaupt
  nichts zu tun.
  Bei #define handelt es sich um eine reine Textersetzung, die
  vom Präprozessor gemacht wird, noch bevor der eigentliche
  Compiler das Programm zu Gesicht bekommt.
  Und da der Präprozessor nicht viel von C versteht, tauscht der
  einfach nur einen Text gegen einen anderen Text aus.
  Nachteil: Wenn der Compiler den Programmtext zu Gesicht bekommt
  ist diese Textersetzung längst erfolgt. D.h. der Compiler hat
  keine Chance für zb. einen Debugger entsprechende Einträge zu
  erzeugen, so dass der Debugger mit der Bezeichnung im Quelltext
  vor der Textersetzung etwas anfangen könnte.


Generell wird empfohlen:
Mit der Einführung von const, sollten Konstante besser über const
als über #define abgewickelt werden. Betrachtet man C++ Programme,
in denen es const schon wesentlich länger als in C gibt, so findet
man dort nur mehr ganz selten irgendwelche #define

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:

> ... Betrachtet man C++ Programme,
> in denen es const schon wesentlich länger als in C gibt, so findet
> man dort nur mehr ganz selten irgendwelche #define

So, const gibt es in C++ schon länger?  Glaub ich nicht, war ja im
ANSI C89/ISO C90 auch schon drin.  Aber es war in C++ eben schon
immer eine tatsächliche Konstante (so wie auch in Pascal), nicht
eine ,,unveränderliche Variable''.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn ich define anstatt const nehme spare ich Ram richtig?

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael wrote:
> wenn ich define anstatt const nehme spare ich Ram richtig?

Wenn eine Variable extern const ist, kann der Compiler ihren Wert nicht 
kennen, und sie muss daher angelegt werden. Sie muss dann auch gelesen 
werden, was ja nach Architektur teurer oder billiger sein kann als ne 
Konstante zu laden.

Wenn es nur lokal in einer Funktion ist, kann der Compiler die const 
optimieren, d.h. er braucht keine Variable des Type anzulegen (wenn 
keine Adresse der Variablen genommen wird, etc.)

Makros können auch über die Kommandozeile per -DWERT=VALUE (gcc) gesetzt 
werden, was bei const nicht geht (es sei denn, ihr Initializer ist ein 
Makro).

Makros kann der Präprozessor abtesten:
#if WERT > 100
#error WERT ist zu gross!
#endif

#if F_CPU % WERT != 0
#warning Berechnung mit WERT wird ungenau!
#endif

Was mit const nicht geht, da sie nicht vom Präprozessor ausgewertet 
werden. Solche Fehlermeldungen sind insbesondere miz F_CPU oder 
Bausdrate-Berechnungen nett, um Warnungen/Fheler zu bekommen, wenn der 
berechnete Wert zu einem ungenauen Ergebnis führt oder nicht in ein SFR 
reinpasst.

Für const geht das leider nicht.  Zur Compilezeit lassen sich keine 
Fehler im Compiler generieren, weil es sowas wie __builtin_error in gcc 
nicht gibt.

Johann

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rauswerfen darf der Compiler sie doch eigentlich nur wenn sie "static 
const" in einem Sourcemodul ist. Andernfalls muss er doch immer 
annehmen, dass sie auch Bestandteil eines Interface sein könnte ?!

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.