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
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
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''.
wenn ich define anstatt const nehme spare ich Ram richtig?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.