Was heißt das c bei cout?



  • Das wäre, aber unschön so hätte man ja unnötig speicher verschwendet, für Objekte die wie möglicherweise nie brauchen.



  • SirLant schrieb:

    Das wäre, aber unschön so hätte man ja unnötig speicher verschwendet, für Objekte die wie möglicherweise nie brauchen.

    Auf welche Aussage bezieht sich das? Hoffentlich nicht auf die vorletzte, oder?

    Pendragon schrieb:

    ist ja auch für den präprozessor. define wurde aber nur übernommen, um mit c kopatibel zu bleiben. (genau wie der restliche mist...) in c++ wurde const eingeführt, da man hier konkrete typen definieren musste. was auch sinnvoll ist, da man dann nicht so leicht bufferoverflows o.ä. durch falsches typenhandling verursacht.

    Du solltest dich von der Vorstellung lösen, dass man #define nur für die Definition von Konstanten benutzen kann.



  • Naja, außer für include-guards fällt mir jetzt nicht mehr besonders viel sinnvolles speziell zum Einsatz von #define ein.
    Disclaimer: Ich rede nicht vom Präprozessor im Allgemeinen, sondern speziell von #define.

    Auf welche Aussage bezieht sich das? Hoffentlich nicht auf die vorletzte, oder?

    Würde mich jetzt auch interessieren.



  • Pendragon schrieb:

    define wurde aber nur übernommen, um mit c kopatibel zu bleiben.

    öhm...nein?
    dann mach das mal ohne präprozessor:

    #include <iostream>
    #define COUT_VAR(argument) std::cout << #argument <<" hat den Wert "<<argument<<std::endl
    int main(){
    int i=5;
    int hallo=10;
    COUT_VAR(i);
    COUT_VAR(hallo);
    }
    

    ausgabe:
    i hat den Wert 5
    hallo hat den Wert 10



  • Optimizer schrieb:

    Naja, außer für include-guards fällt mir jetzt nicht mehr besonders viel sinnvolles speziell zum Einsatz von #define ein.

    Es gibt auch nicht sooo viel, aber es gibt Situationen in denen es ganz nützlich ist. Meist sind es aber nur Sachen, die man zu Debuggingzwecken einbaut.



  • SirLant schrieb:

    Das wäre, aber unschön so hätte man ja unnötig speicher verschwendet, für Objekte die wie möglicherweise nie brauchen.

    man deklariert keine objekte, die man nicht braucht...

    MaSTaH schrieb:

    Du solltest dich von der Vorstellung lösen, dass man #define nur für die Definition von Konstanten benutzen kann.

    in diesem thread geht es aber darum... 😉 schau dir den oben geposteten code einmal an und sage mir, was dort keine konstanten sind...

    otze schrieb:

    öhm...nein?
    dann mach das mal ohne präprozessor:

    C/C++ Code:
    #include <iostream>
    #define COUT_VAR(argument) std::cout << #argument <<" hat den Wert"<<argument<<std::endl
    int main(){
    int i=5;
    int hallo=10;
    COUT_VAR(i);
    COUT_VAR(hallo);
    }
    ausgabe:
    i hat den Wert 5
    hallo hat den Wert 10

    #include 
    void output(int zahl)
    {
    cout << zahl;
    cout << endl;
    }
    
    int main(){
    int i=5;
    int hallo=10;
    output(i);
    output(hallo);
    }
    


  • pendragon, lies nochmal meinen code durch.

    das sit die ausgabe meines programms:

    Programm schrieb:

    i hat den Wert 5
    hallo hat den Wert 10



  • #include <iostream.h> 
    void output(char* name, int zahl)
    {
    cout << name << "hat den wert " << zahl;
    cout << endl;
    }
    
    int main(){
    int i=5;
    int hallo=10;
    output("i", i);
    output("hallo", hallo);
    }
    

    macht das gleiche. ich habe nur keine lust über so einen code zu streiten. mit sicherheit kann man das eleganter lösen...



  • nein, sicher nicht, der präprozessor ist darin unschlagbar.

    nächstes beispiel(als erweiterung des letzten):
    erweitern wir das letzte define einfach mal:

    #define COUT_VAR(argument) std::cout <<"in Datei "<<__FILE__<<" in Zeile "\
    <<__LINE__<<" :"<< #argument <<" hat den Wert "<<argument<<std::endl
    

    die neue ausgabe:

    Programm schrieb schrieb:

    In Datei test.cpp in Zeile 7 :i hat den Wert 5
    In Datei test.cpp in Zeile 8 :hallo hat den Wert 10

    1. da kommst du fast nicht mehr hinterher, der schreibaufwand ohne define ist einfach zu groß.
    2. ein COUT_VAR(i); ist übersichtlicher als ein Output("test.cpp",7,"i",i);
    3. die möglichkeit des präprozessors, code in einer librarie, im falle dass er vom entsprechenden compiler nicht unterstützt wird, einfach auszuklammern und durch eine funktionierende alternative zu ersetzen, ohne dass der benutzer eine zeile code ändern muss, macht ihn unschlagbar

    #ifdef __COMPILER_A__
    class test{...};//klasse für __COMPILER_A__
    #else
    class test{};//klasse für alle anderen compiler
    #endif
    


  • WOW, ich bin begeistert!! 👍

    Aber mal im Ernst: Das ist schon eine interessante Flexibilität. Will ich auch gar nicht abstreiten. Wunderbar.
    Aber wozu gibt es Debugger? Wer debuggt denn ernsthaft mit Ausgaben à la "Der Wert von x ist: 5" ?



  • Bisher dachte ich, das steht für char out. Weil es ja auch wcout gibt, welches für wide char out stehen könnte.



  • @otze
    ich würde sagen, es ist eindeutig nicht die lösung zum oben genannten thema.

    da ich define hauptsächlich nicht benutze, kann ich dir bei deiner übersetzung nicht helfen. aber vielleicht findest du ja einen, der genügend zeit dafür hat...

    3. die möglichkeit des präprozessors, code in einer librarie, im falle dass er vom entsprechenden compiler nicht unterstützt wird, einfach auszuklammern und durch eine funktionierende alternative zu ersetzen, ohne dass der benutzer eine zeile code ändern muss, macht ihn unschlagbar

    hat keiner gesagt, dass man einen präprosessor nicht braucht. wie willst du denn sonst dein iostream includieren?? 😉



  • Optimizer schrieb:

    WOW, ich bin begeistert!! 👍

    Aber mal im Ernst: Das ist schon eine interessante Flexibilität. Will ich auch gar nicht abstreiten. Wunderbar.
    Aber wozu gibt es Debugger? Wer debuggt denn ernsthaft mit Ausgaben à la "Der Wert von x ist: 5" ?

    war ja nur ein primitives beispiel 🙂
    aber sowas ähnliches benutz ich, um in einem programm aussagekräftige exception meldungen zu erzeugen, falls mal was schiefgehen sollte.

    @Pendragon welche lösung? ich wollte keine lösung bringen. uch hab nur diese aussage von dir entkräftet:

    define wurde aber nur übernommen, um mit c kopatibel zu bleiben

    da sie schlichtweg falsch ist.
    Und nein,es gibt keine einfache möglichkeit, dass "__LINE__" bzw "__FILE__" makro zu ersetzen, bzw den "#" operator zu umgehen. Für sowas wurde der präprozessor gemacht.



  • otze schrieb:

    war ja nur ein primitives beispiel 🙂
    aber sowas ähnliches benutz ich, um in einem programm aussagekräftige exception meldungen zu erzeugen, falls mal was schiefgehen sollte.

    dafür gibt es in c++ andere möglichkeiten...



  • Pendragon schrieb:

    otze schrieb:

    war ja nur ein primitives beispiel 🙂
    aber sowas ähnliches benutz ich, um in einem programm aussagekräftige exception meldungen zu erzeugen, falls mal was schiefgehen sollte.

    dafür gibt es in c++ andere möglichkeiten...

    ich bin ganz ohr.



  • otze schrieb:

    "#" operator

    😕 😕 😕



  • stringizing token(wurde in verschiedensten quellen als operator benannt-halt ein präprozessoroperator)



  • @MaSTaH:

    Das ist der 'sharp'-operator. Mit ihm ist es möglich, Teile des Codes in C# zu schreiben und direkt native dann in die C++ Quelldatei einzubinden. :p



  • Optimizer schrieb:

    @MaSTaH:

    Das ist der 'sharp'-operator. Mit ihm ist es möglich, Teile des Codes in C# zu schreiben und direkt native dann in die C++ Quelldatei einzubinden. :p

    *g*

    otze schrieb:

    stringizing token(wurde in verschiedensten quellen als operator benannt-halt ein präprozessoroperator)

    Achso, habe noch nie eine Quelle gesehen in der man das als Operator bezeichnet hat.



  • Ah. So wie der ++-Operator es erlaubt, C++-Code in C einzubinden? Mann bin ich heute wieder schlau 🤡


Anmelden zum Antworten