#define oder const int ?



  • Hallo!

    Wo ist der Unterschied zwischen

    #define bla 5
    const int bla 5

    Was nimmt man wann? Gibt es überhaupt einen Unterschied?



  • #define ist eine präprozessor anweiung, die noch vor dem compilieren eine ersätzung durchführt ... in der exe taucht dann keine variable mehr auf

    das ist bei einem const anders, hier haben wir eine variable, die einfach nur nicht geändert werden kann/soll

    und es muss heißen:

    const int bla=5;

    cu



  • man nimmt const int und nicht #define

    Effektiv C++ programmieren | ISBN: 3827313058

    @ERROR
    der Compiler kann ohne Probleme die Variable auch weglassen



  • Unterschied2000 schrieb:

    Hallo!

    Wo ist der Unterschied zwischen

    #define bla 5
    const int bla 5

    Was nimmt man wann? Gibt es überhaupt einen Unterschied?

    irgendwo in einem header steht

    #define bla 5
    

    und ich will schreiben

    void f(){
       int bla=6;
       cout<<bla;
    }
    

    das klappt nicht, weil da jetzt steht:

    void f(){
       int 5=6;//error
       cout<<5;
    }
    

    mit const int passiert das nicht.
    also #define macht einen bezeichner endgültig kaputt und für keinen mehr umdefinierbar. const int aber ist lieb und ich kann lokale variablen oder so des gleichen namens noch anlegen. das ist besser.



  • kingruedi schrieb:

    @ERROR
    der Compiler kann ohne Probleme die Variable auch weglassen

    Hat const int bla = 5; nicht externe Bindung? Ganz weglassen kann er die also nicht. Eher static const int bla = 5;



  • Volkards Erklärung warum man nicht define nimmt war sehr gut, danke !



  • Ausserdem können define's nicht in Namespaces genutzt werden, im gegensatz zu const.



  • @kingruedi: ok, wenn er das wegoptimieren kann, aber das ist imho ein ganz anderes thema ;-?



  • Ponto schrieb:

    kingruedi schrieb:

    @ERROR
    der Compiler kann ohne Probleme die Variable auch weglassen

    Hat const int bla = 5; nicht externe Bindung?

    Nein interne - siehe 3.5/p3. Solange du deinen Compiler nicht dazu zwingst Speicher für bla anzulegen (in dem du z.B. die Adresse von bla bildest), kann er problemlos ohne Speicher für bla auskommen und direkt mit dem Wert arbeiten.



  • Warum aber überhaupt const? Man kann doch einfach normale ints nehmen. oder?



  • Dann kann aber jeder den Wert verändern ob absichtlich oder unabsichtlich und man möchte das ja nicht da es _Konstanten_ sind



  • const kann soweit ich weis auch etwas schneller sein, weil der compiler bei der positionierung von const objekten im speicher nicht so sehr aufpassen muss.



  • Warum aber überhaupt const? Man kann doch einfach normale ints nehmen. oder?

    const int a=4;
    char b[a]; //OK
    int a=6;
    short d[a]; //bum
    

    Es ist nicht so als wenn das ersetzen von a durch 4 in der entgültigen exe eine optionale Optimierung wäre (wie es in C ist) sonder ein C++ Compiler muss, sofern möglich, a durch 4 ersetzen und auch überall erlauben wo der Wert at compile time bekannt sein muss.

    Desweiteren wenn man an einer Stelle den Compiler zwingt eine Variable zu erzeugen und sie dann verändert (mit const_cast zum Beispiel) dann muss a an ander Stelle nicht verändert werden (darf sie glaub ich nicht einmal).

    Also:

    const int a=5;
    *const_cast<int*>(&a)=6;
    cout<<a;
    

    wird 5 ausgeben



  • const int
    #define sollte man nur nehmen wenn es keinen anderen Weg gibt. Und const int ist ein Weg. enum ein anderer (aber mit Nachteilen)

    const int x hat statische Bindung, extern müßte explizit angegeben werden.
    wenn die Variable extern deklariert ist, darf der compiler sie nicht weglassen, wohl aber der Linker 😉

    const sagt dem Compiler (an dieser Stelle) auch, daß der Wert sich tatsächlich nicht ändert, und damit der Wert direkt eingesetzt werden kann.



  • jo, const optimiert besser und nicht nur bei statischen Arrays ist es wichtig, sondern auch bei Template Parametern

    template<int i>
    inline int foo() { return i+10; }
    
    int main() {
      const int a=10;
      foo<a>();
      int b=10;
      foo<b>(); //möp!
    }
    

Log in to reply