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


von Bernd (Gast)


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

von Karl H. (kbuchegg)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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''.

von Michael (Gast)


Lesenswert?

wenn ich define anstatt const nehme spare ich Ram richtig?

von Johann L. (gjlayde) Benutzerseite


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:
1
#if WERT > 100
2
#error WERT ist zu gross!
3
#endif
4
5
#if F_CPU % WERT != 0
6
#warning Berechnung mit WERT wird ungenau!
7
#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

von Alex (Gast)


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 ?!

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.