const vs #define

NetzUnity und Informatik-forum wurden zusammengelegt. Eine entsprechende Ankündigung wird demnächst noch folgen. Für 2025 ist hier einiges geplant! Bei Fragen bitte per DM an Maximilian Rupp wenden.
  • 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.

    Es gibt nur einen Gott:
    Farin - Bela - Rod
    ---------------------------------------
    There are 10 types of people:
    those that understand binary,
    and those that don´t!!!

  • Zitat von fuxi17

    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.

    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 markus

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


    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 markus

    global 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.)

    *plantsch*

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


    Trading for a living [equities,futures,forex]

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!