C



  • Ich habe NICHT gesagt , dass man kein const verwenden sollte.
    const ist gut/wichtig!
    Bloß: Wenn jemand versucht irgendwelche (Sprach-)Elemente aus C++ zu verbannen , die in C vorhanden waren und durch neuere in C++ "ersetzt" wurden,dann kotz dass mich an.

    (Gut: #define ist zwar nur eine (Preprozessor-)Direktive und kein Sprachelement aber egal...ich benutz des trotzdem gern)

    Ich meine:

    #define IRGENDWAS 123
    

    ist einfacher als

    const int IRGENDWAS 123;
    

    OK...zugegeben: beides ist nicht wirklich schwer tu tippen

    ...und was ich über das "const" geschrieben habe , war nicht auf OOP bezogen ,sondern auf das obrige Beispiel...
    OK? 😃



  • #define IST schlecht, aber deswegen gibt es trotzdem Situationen, in denen man nicht drumherum kommt*. Vor allem schert sich eine #define "Konstante" überhaupt nicht um irgendwelche Sichtbarkeitsgrenzen (eben weil sie vom Präprozessor verarbeitet wird).

    * Versuch' z.B. mal einen Include-Guard ohne Präprozessort zu bauen 😉



  • Paradebeispiel!
    äham , ja:
    Wie du schon sagtest: man kommt in manchen Situationen nicht um #define rum.
    Und was ist wenn man die Sichtbarkeitsgrenzen (absichtlich) umgehen will, oder was ist mit den schönen #define Makros???Oder dein Beispiel mit "#include-guard"...naja...
    ...super! schon 3 Seiten...dieser Thread wächst wie WASWEIßICH 🙂



  • Und was ist wenn man die Sichtbarkeitsgrenzen (absichtlich) umgehen will

    Dafür kann man auch const (auf globaler Ebene) verwenden - hat sogar den Vorteil, daß der Compiler verständliche Fehlermeldungen ausspuckt 😉

    oder was ist mit den schönen #define Makros???

    sagt dir "inline" (komplett: "template<typename T> inline f(T x);") zufällig etwas?



  • CStoll schrieb:

    Und was ist wenn man die Sichtbarkeitsgrenzen (absichtlich) umgehen will

    Dafür kann man auch const (auf globaler Ebene) verwenden - hat sogar den Vorteil, daß der Compiler verständliche Fehlermeldungen ausspuckt 😉

    oder was ist mit den schönen #define Makros???

    sagt dir "inline" (komplett: "template<typename T> inline f(T x);") zufällig etwas?

    ...also auf die vollständigen Fehlermeldungen kann ich sch*iss*n...des mit der Sichtbarkeitsgrenze stimmt auch...geht aber auch mit #define wie mit const wie mit #define wie mit const wie mit #define ...

    Und zu: template<typename T> inline f(T x);
    Das kenn ich noch garnet. Sowas ist mir neu.
    In meinem C++ Buch stand nix davon...sieht aber logisch aus.Das ist wieder Mal typisch: Man kann so gut wie kein Buch kaufen/finden in dem ALLES,also wirklich alles,beschrieben ist. Immer werden irgendwelche Sprachelemente ausgelassen.
    zB: Das Bitshiften(also Infos darüber) musste ich mir aus anderen Quellen besorgen. Des mit template<typename T> inline f(T x); ist wirklich nicht schlecht.Also da muss ich dir Recht geben. Aber #define benutz ich trotzdem fröhöich weiter...! 😃 😃 😃



  • Diskussion beendet. Bringt eh nichts. ⚠



  • alex89ru schrieb:

    Bloß: Wenn jemand versucht irgendwelche (Sprach-)Elemente aus C++ zu verbannen , die in C vorhanden waren und durch neuere in C++ "ersetzt" wurden,dann kotz dass mich an.

    Das Problem ist einfach, dass der Präprozessor keine Namensräume kennt, deshalb verwendet man in C++ für Konstanten idR const und nicht #define. Und das hat nichts damit zu tun, dass man alte C Sprachelemente "verbannen" will.



  • alex89ru schrieb:

    Bloß: Wenn jemand versucht irgendwelche (Sprach-)Elemente aus C++ zu verbannen , die in C vorhanden waren und durch neuere in C++ "ersetzt" wurden,dann kotz dass mich an.

    naja, const ist ganz gut gelungen und man sollte es nehmen.

    aber mich kotzt es auch an, wenn gepredigt wird, alles auf eine art zu machen, die in c++ geht und in c nicht. das artet dann in lustige sachen aus wie

    char ersterBuchstabe(string const& str){
       return str[0];
    }
    //nebst 
    cout<<ersterBuchstabe("hallo")<<endl;
    

    wobei man durchaus nullterminierte strings nehmen könnte. mindestens eine zusätzliche überlaudng mit

    char ersterBuchstabe(char const* str){
       return str[0];
    }
    

    sollte her.
    wenn man das nicht macht, ist man auf einmal bei den leuten, wo c++ langsamer als c ist, weil, weil...
    man kann in jeder sprache unfug treiben, aber in c++ muß man aufpassen, keinen zu treiben.



  • groovemaster schrieb:

    Das Problem ist einfach, dass der Präprozessor keine Namensräume kennt, deshalb verwendet man in C++ für Konstanten idR const und nicht #define. Und das hat nichts damit zu tun, dass man alte C Sprachelemente "verbannen" will.

    äh 😕
    wo ist denn hier überhaupt das problem #define <-> const
    geht doch beides sowohl in c als auch in c+++, benutze bei c auch const 😋



  • groovemaster schrieb:

    Das Problem ist einfach, dass der Präprozessor keine Namensräume kennt, deshalb verwendet man in C++ für Konstanten idR const und nicht #define. Und das hat nichts damit zu tun, dass man alte C Sprachelemente "verbannen" will.

    ...dass mit #define und const war nur ein BEISPIEL!

    Jap , im übrigen schließe ich mich volkards Meinung voll und ganz an!!!
    Und wie schon gesagt: Ich mag C ___UND___ C++!!!
    Ich will hier C++ nicht schlecht darstellen...

    Un noch was an den UNREGISTRIERTEN "C-Moderator": Von mir aus kann diese Diskusion so weiter gehen ... mir gefällts ... hier kommen endlich "wahre" Dinge ans Licht 😃 😃 😃 😃



  • @icepackker: In C sind const und #define leider nicht austauschbar - z.B. folgender Code ist völlig legal in C++, aber verboten für C:

    const int count=100;
    char array[count];
    

    (um das selbe Array in C zu deklarieren, führt kein Weg an "#define count 100" vorbei)

    @alex: Klar hat auch C seine Vorteile (und ich hab' auch nichts gegen C), aber wenn etwas mit C++ leichter und sicherer zu bewerkstelligen ist, sollte man sich nicht auf den "C-Weg" festlegen 😉



  • Ja , stimmt schon irgendwie , aber alte Gewohnheiten wird man bekanntlich nur sehr schwer los (vielleicht lieft es ja daran , dass ich es nicht loswerden will), naja jedenfalls benutze ich fröhlich #define weiter(aus kompatibilitätsgründen zu C aus welchem Grund auch immer) und wenn jemand const benutzt habe ich auch bichts dagegen,
    Mir geht es nur darum , dass eine Sprache die andere nicht verbannt!
    Naja , schönene Tag noch und viel Spaß beim coden mit const ___UND #define!!!
    😃



  • alex89ru schrieb:

    Ja , stimmt schon irgendwie , aber alte Gewohnheiten wird man bekanntlich nur sehr schwer los (vielleicht lieft es ja daran , dass ich es nicht loswerden will), naja jedenfalls benutze ich fröhlich #define weiter(aus kompatibilitätsgründen zu C aus welchem Grund auch immer) und wenn jemand const benutzt habe ich auch bichts dagegen,
    Mir geht es nur darum , dass eine Sprache die andere nicht verbannt!
    Naja , schönene Tag noch und viel Spaß beim coden mit const ___UND #define!!!
    😃

    das ist jetzt aber ein böswilliges ablehnen jeglicher einsicht zum zwecke des trollens.



  • Ich sehe garnichts ein...da es nichts einzusehen gibt!!!
    Sei tollerant gegenüber C und C++!!!! Nicht nur C++.



  • alex89ru schrieb:

    Ich sehe garnichts ein...da es nichts einzusehen gibt!!!
    Sei tollerant gegenüber C und C++!!!! Nicht nur C++.

    Wieso sollten wir? Wir sind auch gegenüber QBasic nicht tolerant 😃



  • alex89ru schrieb:

    Ich sehe garnichts ein...da es nichts einzusehen gibt!!!
    Sei tollerant gegenüber C und C++!!!! Nicht nur C++.

    nimm in C #define und in C++ const. es sind verschiedene sprachen. machst ja auch nicht

    #define BEGIN {
    #define END }
    

    um mit pascal kompatiben zu sein oder

    #define print cout<<
    

    um wie imn basic

    print "hallo, welt";
    

    schreiben zu können.



  • Das liegt vielleicht daran , da ich NICHT tolerant gegenüber Basic , Qbasic , VisualBasic und sonstigem Scheiss bin.
    Un im Grunde genommen ist es doch SCHEISSEGAL ob man #define oder oonst nimmt!
    Im Endeffekt kommt eh das gleiche raus... gleicher code.!!!
    zugegeben : So tolerant gegenüber anderen Sprachen bin ich auch net!!!!!!!!!!!! :p
    Aber C und C++ sind miteinander verwandt.
    So



  • Un im Grunde genommen ist es doch SCHEISSEGAL ob man #define oder oonst nimmt!Im Endeffekt kommt eh das gleiche raus... gleicher code.!!!

    Falsch, da der Präprozessor dein #define rausfiltert (und jedem Debugger unbekannt ist), wird ein anderer Code erzeugt, als wenn du const verwendest.



  • Tja GPC: Hab gerade etwas ausprobiert(mit g++).
    Einmal mit #define und einmal mit const und es ist der gleiche assembler code rausgekommen!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    (habs mit g++ -o someasmcode.s -S test.c "compiliert")

    1:

    const int B = 0xff;
    
    int main (void)
    {
        char buf[B];
    }
    

    ... sit identisch mit

    [/cpp]
    #define B 0xff;

    int main (void)
    {
    char buf[B];
    }
    [cpp]

    Tja , GPC: identischer code. const hat nur den vorteil wegen der compiler meldungen.



  • Probier das mal das unten aus, und sag mir dann ob immer noch der gleiche asm-Code rauskommt. Vorher hat der Compiler bei deinem Beispiel wahrscheinlich B als unused erkannt und wegoptimiert.

    #define SIZE 5
    
    int main(int argc, char **argv) {
      int arr[SIZE];
      cout<<SIZE<<'\n';
      return 0;
    };
    
    const size_t SIZE = 5;
    
    int main(int argc, char **argv) {
      int arr[SIZE];
      cout<<SIZE<<'\n';
      return 0;
    };
    

Anmelden zum Antworten