Frage zu C++ Reference und anderen Quellen



  • silent_max schrieb:

    Also sprich, ich könnte alles, was in C möglich ist, auch in C++ machen?? Ich muss es nur schaffen, die Beispiele auf http://en.cppreference.com/w/ und http://www.cplusplus.com/reference/ auf C++ zu transfermieren?

    Korrekt, du brauchst nichtmal was transferieren. C++ ist eine Erweiterung von C, hieß auch mal C mit Klassen. Es gibt die Ausnahme mit dem impliziten Cast von void * auf einen beliebigen Pointer was in C geht und in C++ nicht, aber ansonsten geht alles in C++ genauso wie in C.
    Allerdings hat C++ versucht bessere oder zumindest andere Möglichkeiten bereit zu stellen, sodass es häufig zwei Möglichkeiten gibt. char * vs std::string, x[] vs std::vector<x>, printf vs std::cout, malloc/free vs new/delete ....
    Nicht immer sind die C++-Varianten besser. Häufig wird es aber als schlechten Stil angesehen wenn man die Varianten mischt und Leute wie Sone regt es maßlos auf wenn man im C++-Forum was mit printf schreibt, obwohl es korrektes C++ ist.
    Du solltest für dich entscheiden, ob du strikt C++ machen willst, alla "C ist Teufelszeug" oder auch die C-Funktionen nutzen willst. Wenn du reines C++ willst, was keine schlechte Idee ist, dann solltest du #includes, die mit .h enden oder mit c anfangen eher meiden (gibt sicher Ausnahmen).

    *wartet auf Sones gepolter* :trollface:



  • geht alles in C++ genauso wie in C.

    Nein. Es gibt viele Kleinigkeiten, wie der Scope einer im for-init-statement deklarierten Variable.

    char * vs std::string

    Das ist kein Kampf. std::string hat so gut wie überall gewonnen. Ausnahme: absolute Performance.

    malloc/free vs new/delete

    malloc und free sind in C++ absolut Tabu.

    Leute wie Sone regt es maßlos auf wenn man im C++-Forum was mit printf schreibt, obwohl es korrektes C++ ist.

    printf hat deutliche Nachteile gegenüber den C++-Streams, und kooperiert auch einfach nicht mit cout (bspw. Failbits). Daher sollte es einfach nicht verwendet werden.

    Wenn du reines C++ willst, was keine schlechte Idee ist, dann solltest du #includes, die mit .h enden oder mit c anfangen eher meiden (gibt sicher Ausnahmen).

    Nein, der ganze Tipp ist Blödsinn.

    *wartet auf Sones gepolter* :trollface:

    Nach so eine Post ist das ja auch kein Wunder.



  • std::string verwendet Heap-Allocation (ausser bei extrem kurzen Strings) und ist somit gar nicht so toll wie hier immer angepriesen wird. Jede Heap-Allocation ist sau teuer.



  • std::string ist eine Stringklasse für den Alltag. Sie hat gar nicht den Anspruch, in jeder möglichen Situation die beste zu sein. Ihr Design ist auch umstritten, ausserdem kommt man im Bezug auf Locales und Unicode an die Grenzen.

    Fakt ist: char* mit manueller Speicherverwaltung ist keine Alternative. Das ist schlicht zu fehleranfällig und benötig zu viel Boilerplate-Code, um produktiv eingesetzt zu werden. Für spezifische Anwendungsszenarien nimmt man sich eine auf den Fall zugeschnittene Klasse oder implementiert selbst eine.



  • Sone schrieb:

    geht alles in C++ genauso wie in C.

    Nein. Es gibt viele Kleinigkeiten, wie der Scope einer im for-init-statement deklarierten Variable.

    Zeig mal ein Beispiel, dass in C geht und in C++ nicht.

    Sone schrieb:

    Leute wie Sone regt es maßlos auf wenn man im C++-Forum was mit printf schreibt, obwohl es korrektes C++ ist.

    printf hat deutliche Nachteile gegenüber den C++-Streams, und kooperiert auch einfach nicht mit cout (bspw. Failbits). Daher sollte es einfach nicht verwendet werden.

    Natürlich nicht. Als printf entworfen wurde hat niemand gedacht, dass es ein Objekt für Ausgaben geben könnte. Genauso gut könnte man sagen, dass cin schlecht ist, weil es nicht mit fscanf kooperiert.

    Sone schrieb:

    char * vs std::string

    Das ist kein Kampf. std::string hat so gut wie überall gewonnen. Ausnahme: absolute Performance.

    Ich habe nicht von Kämpfen gesprochen, sondern von einem C-Weg und einem C++-Weg, die am Ende dasselbe tun, aber irgendwie doch verschieden und häufig inkompatibel zueinander sind.



  • nwp3 schrieb:

    Sone schrieb:

    geht alles in C++ genauso wie in C.

    Nein. Es gibt viele Kleinigkeiten, wie der Scope einer im for-init-statement deklarierten Variable.

    Zeig mal ein Beispiel, dass in C geht und in C++ nicht.

    void f(const a);
    
    int main(void) {return 0;}
    

    nwp3 schrieb:

    Sone schrieb:

    Leute wie Sone regt es maßlos auf wenn man im C++-Forum was mit printf schreibt, obwohl es korrektes C++ ist.

    printf hat deutliche Nachteile gegenüber den C++-Streams, und kooperiert auch einfach nicht mit cout (bspw. Failbits). Daher sollte es einfach nicht verwendet werden.

    Natürlich nicht. Als printf entworfen wurde hat niemand gedacht, dass es ein Objekt für Ausgaben geben könnte. Genauso gut könnte man sagen, dass cin schlecht ist, weil es nicht mit fscanf kooperiert.

    Dafür ist std::cin im Gegensatz zu fscanf Typsicher, IMO lesbarer und besser auf Fehler prüfbar.

    Oder wie viele C-Programmierer die du kennst, prüfen nach jedem Benutzen von fscanf feof(stdin) oder ferror(stdin) ?
    Oder den Rückgabewert?

    nwp3 schrieb:

    Sone schrieb:

    char * vs std::string

    Das ist kein Kampf. std::string hat so gut wie überall gewonnen. Ausnahme: absolute Performance.

    Ich habe nicht von Kämpfen gesprochen, sondern von einem C-Weg und einem C++-Weg, die am Ende dasselbe tun, aber irgendwie doch verschieden und häufig inkompatibel zueinander sind.

    std::string hat wieder deutliche Vorteile gegenüber C-Strings, die dir eigentlich bekannt sein sollten.



  • prot schrieb:

    std::string verwendet Heap-Allocation (ausser bei extrem kurzen Strings) und ist somit gar nicht so toll wie hier immer angepriesen wird. Jede Heap-Allocation ist sau teuer.

    Diese Kost muss man tragen, wenn man berücksichtigt, wie klein der Stack nur ist.

    ausserdem kommt man im Bezug auf Locales und Unicode an die Grenzen.

    👍


  • Mod

    Sone schrieb:

    nwp3 schrieb:

    Sone schrieb:

    geht alles in C++ genauso wie in C.

    Nein. Es gibt viele Kleinigkeiten, wie der Scope einer im for-init-statement deklarierten Variable.

    Zeig mal ein Beispiel, dass in C geht und in C++ nicht.

    void f(const a);
     
    int main(void) {return 0;}
    

    Etwas praxisnäher:

    int *foo = malloc(2*sizeof(int));
    

    Oder aktueller:

    auto int foo;
    

    Kaum bekannt, aber interessant:

    sizeof('c');
    

    Ein bisschen was freches:

    int static_cast;
    

    Einer der wohl bekanntesten Fälle:

    char *non_const = "Literal";
    

    Aus dem Standard ein überraschendes Beispiel:

    char arr[100];
    sizeof(0, arr); // 100 in C++, sizeof(char*) in C
    

    Auch sehr oft in der Praxis benutzt:

    enum autos{vw, bmw, benz};
    enum autos auto = 1;
    

    Ich könnte noch den ganzen Tag weitermachen, aber wenn wirklich Interesse besteht, dann lese man den C++-Standard. Der hat ein (ziemlich langes) Kapitel über Inkompatibilitäten.



  • char *non_const = "Literal";
    

    Gibt AFAIR nur eine Warnung. Das kompiliert in C++ meines Wissens nach.

    Ich guck aber sicherheitshalber noch mal nach... :xmas2:

    Edit: Ja, hatte Recht. G++ (4.8!) gibt nur eine deprecated Warnung.

    Warte, ich schlag mal nach.


  • Mod

    Dann macht der GCC das wegen Kompatibilität zu altem Code. Es ist jedenfalls streng genommen nicht richtig. Setz mal den Standard auf C++ (nicht GNU C++!) und den Modus auf pedantic.



  • SeppJ schrieb:

    Dann macht der GCC das wegen Kompatibilität zu altem Code.

    Verdammt, das wollte ich auch gerade schreiben 😡

    Ja, es ist nicht standardkonform, da hast du natürlich Recht.


Anmelden zum Antworten