Hallo,
eine kurze Frage: was ist in c++ fuer Konstanten zu bevorzugen, oder was bevorzugt ihr: const oder #define?
lg Markus
Hallo,
eine kurze Frage: was ist in c++ fuer Konstanten zu bevorzugen, oder was bevorzugt ihr: const oder #define?
lg Markus
Mit #define definierte Konstanten sind global was meistens zu vermeiden ist!! Mit const definierte Konstanten gehorchen den gewöhnlichen Sichtbarkeitsregeln und sind daher in den meisten Fällen zu bevorzugen.
Zitat von fuxi17Mit #define definierte Konstanten sind global was meistens zu vermeiden ist!! Mit const definierte Konstanten gehorchen den gewöhnlichen Sichtbarkeitsregeln und sind daher in den meisten Fällen zu bevorzugen.
nein. mit define definierte macros sind weder konstanten noch haben sie
einen sope (koennen deshalb auch nicht global sein). die macros werden
vor dem compilieren durch den praeprocessor ab der sichbarkeit des macros
bis zum ende des programmcodes oder eines #undef dieses macros ersetzt.
macros haben keinen typ und sind deshalb auch nicht typsicher. diese typsicherheit
kann durch verwenden von user-defined constanten erreicht werden. das schluesselwort const definiert dabei nicht notwendigerweise eine konstante sondern gibt den compiler lediglich den hint, dass dieses speicherobjekt als read-only zu betrachten ist. es ist syntaktisch kein konstanter ausdruck und kann durch cast auch veraendert werden.
/edit: was unter umstaenden undefined behaviour ausloest.
das schluesselwort const macht also nicht genau das was man denken koennte
die moeglichkeit die dem, was der OP machen will, am ehesten entspricht
sind enums.
die frage, wann was verwendet werden soll haengt stark vom problem ab,
das man loesen will. wenn man typsicherheit erzwingen will so kommt man
an einer user-defined constant oder eine enum nicht vorbei.
lg
amok
ein konkretes Beispiel
ich habe mir angewohnt, "konstanten", die der benutzer nie zu gesicht bekommt, per #define zu definieren. während der testphase ist es da zusätzlich noch ein leichtes, die zahlenwerte anzupassen. für konstanten wie wurzel(2) oder dimensionszahlen nehme ich auch immer # define her. global zu definieren habe ich noch in der htl gelernt ist ein absolutes dont´t. zumindest in c wars so. was ist für c++ jetzt "eleganter"?
danke
markus
Zitat von markusich habe mir angewohnt, "konstanten", die der benutzer nie zu gesicht bekommt, per #define zu definieren. während der testphase ist es da zusätzlich noch ein leichtes, die zahlenwerte anzupassen. für konstanten wie wurzel(2) oder dimensionszahlen nehme ich auch immer # define her. global zu definieren habe ich noch in der htl gelernt ist ein absolutes dont´t. zumindest in c wars so. was ist für c++ jetzt "eleganter"?
wenn du c++ für objektorientierte programmierung verwendest, bietet es sich an, konstanten jeweils in den klassen unterzubringen, wo sie am meisten sinn machen. zumindest in java und c# war das bisher meist eine für mich recht angenehme lösung.
lg michi
Zitat von markusglobal zu definieren habe ich noch in der htl gelernt ist ein absolutes dont´t. zumindest in c wars so.
Erstens: Der Apostroph schaut nicht so aus: ` , sondern so: ' . D.h. don't. Sorry, aber irgendwie nervt mich das, daß das so viele Leute falsch machen.
No gut, zum Inhaltlichen: Ja, globale Variable sind meistens inelegant und sollten vermieden werden. Das hat damit zu tun, daß es schwieriger ist, Code nachzuvollziehen, wenn man keinen Überblick drüber hat, wo eine Variable überall geändert werden kann. Gegen globale Konstante greift dieses Argument nicht, die können ja nirgends geändert werden. Und es schadet wohl niemandem, wenn alle Programmteile wissen, daß pi gleich 3 ist Also wenn du eine Konstante wirklich (fast) überall brauchst, mach sie von überall sichtbar, d.h. global.
Du kannst natürlich eine Klasse drumherum schreiben, aber wenn die Konstante static ist, ist das eine rein kosmetische Maßnahme: meine_konstanten:: pi ist genauso "global" wie ein echt globales pi, nur mehr zum tippen. (Das soll aber nicht heißen, daß Kosmetik keine gute Sache ist. Aber man sollte sich darüber im Klaren sein, daß Klassen nicht automatisch glücklich machen.)
Zitat von Plantschkuh!Erstens: Der Apostroph schaut nicht so aus: ` , sondern so: ' . D.h. don't. Sorry, aber irgendwie nervt mich das, daß das so viele Leute falsch machen.
das stört mich auch oft.. umso größer der schock, als ich bemerkt habe, dass die unix-shells alle zumindest den ` backtick wie ein anführungszeichen verwenden (ich weiß, " und ' waren schon vergeben).
was die konstanten betrifft: oft hat man ja nicht so grundlegende konstanten (die man natürlich nicht in eine klasse sperren sollte), sondern eher anwendungsspezifische, die man dann schön einsortieren kann.
auch irgendwie in mode, obwohl ich es nicht mag: eine konfigurations-klasse schreiben, die "konstanten" aus einer xml-datei liest :distur: wobei das dann natürlich keine konstanten mehr in unserem sinne sein können..
lg michi
Zu dem was amok und Plantschkuh gesagt haben, gibts eigentlich nichts oder fast nichts mehr hinzuzufügen.
Eleganz ist ohnehin subjektiv.
Wichtiger ist ganz genau zu wissen, was ein
#define, const keyword, enum .. etc tut.
Kanns nur nochmal betonen, daß const's oft nicht das tun was man sich intuitiv erwartet.
Sich genau zu üerlegen, WARUM globale Variablen
problematisch sein können und warum machmal doch nicht.
Dann von Fall zu Fall entscheiden.
Allgemein gültige Regeln dazu gibts IMHO nicht.
z.B
NIEMALS globale Variablen benutzen.
Niemales #defines benutzen.
consts sind immer eleganter als #defines, ...
Alles nonsense.
Yo!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!