Sprachliche Unterschiede zwischen C und C++?



  • Shade Of Mine schrieb:

    C hat ja auch einen Vorteil gegenüber C++ -> es ist leichter vernünftige Compiler dafür zu schreiben 😉

    jup.



  • Ach kommt schon, ich frage mal so:

    Wenn ihr gefragt werdet, was denn die Unterschiede zwischen C und C++ sind, welche Antworten würdet ihr darauf geben?





  • 1. anonymous unions
    2. classes
    3. constructors and destructors
    4. exceptions and try/catch blocks
    5. external function linkages (e.g., extern "C")
    6. function overloading
    7. member functions
    8. namespaces
    9. new and delete operators and functions
    10. operator overloading
    11. reference types
    12. standard template library (STL)
    13. template classes
    14. template functions

    ....................

    1. akzeptiere ich
    2. heißt das, dass C keine Klassenhierachien unterstüzt?
    3. akzeptiere ich
    4. akzeptiere ich
    5. verstehe ich nicht! ⚠
    6. akzeptiere ich
    7. akzeptiere ich
    8. akzeptiere ich
    9. akzeptiere ich
    10. akzeptiere ich
    11. C hat doch auch Pointer und Referenzen ⚠
    12. akzeptiere ich
    13. akzeptiere ich
    14. akzeptiere ich


  • untschied schrieb:

    Ach kommt schon, ich frage mal so:
    Wenn ihr gefragt werdet, was denn die Unterschiede zwischen C und C++ sind, welche Antworten würdet ihr darauf geben?

    ich würde wohl sowas sagen wie:

    die reinen sprachen sind sehr ähnlich. c++ kann ein paar sachen mehr, die für objektorientierte programmierung sehr angenehm sind und kann auch sonst ein paar sachen mehr, die zu weniger fehleranfälligem code führen. ist dafür aber auch um einiges komplexer geworden.
    wichtige unterschiede sind aber in den sprachen nicht zu suchen, sondern in den gemeinden um die sprachen. es gibt inzwischen einen modernen c++-stil, der sich ganz erheblich von anderen stilrichtungen unterscheidet. insesondere vom üblichen stil in c. normalerweise meine ich mit "c++" nicht die reine sprache, sonbdern den stil. und c++-programme kann man in jeder sprache bauen (ich sage hier bewusst bauen, nicht schreiben).
    ...
    und dann je nach interesse kann's so ne dreiveirtel stunde weitergehen.



  • unterschied schrieb:

    2. classes
    5. external function linkages (e.g., extern "C")
    11. reference types

    1. heißt das, dass C keine Klassenhierachien unterstüzt?

    Das kann man da zwar nicht rauslesen (Fehler in der Liste anscheinend, inheritance fehlt), aber ansonsten stimmt das. Es gibt keine Vererbung in C.

    1. verstehe ich nicht! ⚠

    Was verstehst du nicht? Dass es extern "C" nicht gibt? Gibts halt nicht :p Oder was das in C++ macht?

    1. C hat doch auch Pointer und Referenzen ⚠

    Nö, C hat keine Referenzen.



  • untschied schrieb:

    Wenn ihr gefragt werdet, was denn die Unterschiede zwischen C und C++ sind, welche Antworten würdet ihr darauf geben?

    Grob gesagt, C hat keine Namensräume, Klassen, Templates und Exceptions. Alles andere sind Details.

    unterschied schrieb:

    1. C hat doch auch Pointer und Referenzen

    Zeiger schon, Referenzen nicht.



  • Danke für die Antworten. 👍

    1. ich verstehe nicht, was extern in C++ macht.

    2. wieso gibt es keine Referenzen? Wenn ich & benutze, dann ist das doch eine Referenz auf "etwas", oder nicht?



  • untschied schrieb:

    1. ich verstehe nicht, was extern in C++ macht.

    Dasselbe wie in C. Es ging hier aber um 'extern "C"'. Damit legt man fest, dass ein Name "C-Linkage" hat. Das hat hauptsächlich den Sinn, dass man C-Bibliotheken ansprechen kann. Eine C-Funktion namens foo würde normalerweise dem Linker unter _foo bekannt sein. In C++ gibt es aber Überladung, also mehrere foos, demzufolge codiert der Compiler die Argumenttypen mit in den Namen (Name Mangling), so dass aus foo(int) bspw. foo@i oder etwas in der Art wird. Mit extern "C" erzwingt man die C-Konvention.

    1. wieso gibt es keine Referenzen? Wenn ich & benutze, dann ist das doch eine Referenz auf "etwas", oder nicht?
    int i = 42;
    int &r = i;
    

    ist in C ein Syntaxfehler.



  • ABER

    int i = 23;
    int *p = &i; //das ist doch eine Referenz oder etwa nicht?
    


  • Nein.



  • volkard schrieb:

    ich erinnere nur mal an die alten nullterminierten strings. heute darf man zwei zeiger nehmen. man braucht nicht mehr im string zu hudeln, wenn man einen tokenizer baut. die ewig-lästigen aufrufe von strlen fallen weg. irgendwie ist das dichter an der maschine (am prozessor) als nullterminierte strings.

    wie meinste das? irgendwie muss das ende doch erkannt werden. ob man nun eine 0 ans ende packt oder irgendwo die länge speichert. beides ist 'nah an der maschine'

    btw: ein weiterer grund warum c++ auf 'embedded' nicht so beliebt ist, ist dass man dessen erweiterte features kaum einsetzen kann. so'n stl-kram der willkürlich 'new'd' und 'deleted' ist kaum zu gebrauchen auf'nem controller mit z.b. 8k ram. ausser das man variablen irgendwo hinschreiben kann und die bessere typüberprüfung von c++ hat es sonst keine vorteile gegenüber c



  • net schrieb:

    ausser das man variablen irgendwo hinschreiben kann

    ... was in C99 auch geht (aber widerlich ist) ...

    und die bessere typüberprüfung von c++ hat es sonst keine vorteile gegenüber c

    Es gibt, soweit ich das jetzt überblicke, keine bessere Typenprüfung in C++.

    C hat eine bewußt eingefügte Lücke -- die Geschichte, daß man einen void* an einen anderen anderen Zeiger zuweisen kann --, aber sonst?



  • net schrieb:

    wie meinste das? irgendwie muss das ende doch erkannt werden. ob man nun eine 0 ans ende packt oder irgendwo die länge speichert. beides ist 'nah an der maschine'

    sprach ich von anfang und länge?
    ich meine anfang und ende. und ein zwei-zeiger-großes objekt wird immer übergeben, nicht mehr nur ein zeiger.

    btw: ein weiterer grund warum c++ auf 'embedded' nicht so beliebt ist, ist dass man dessen erweiterte features kaum einsetzen kann. so'n stl-kram der willkürlich 'new'd' und 'deleted' ist kaum zu gebrauchen auf'nem controller mit z.b. 8k ram. ausser das man variablen irgendwo hinschreiben kann und die bessere typüberprüfung von c++ hat es sonst keine vorteile gegenüber c

    reicht das nicht? und den embedded-programmier-sklaven sagt man, sie sollen code bauen, der euf embedded system gut rennt.
    es wird dort nur deswegen kein c++ eingesetzt, weil die chefs gar keine ahnung haben, was c++ ist. daß man da nicht std::string nehmenb MUSS, ist nämlich mein geheimnis.



  • Das Beziehen der Adresse hat absolut nichts mit einer Referenz zu tun!



  • volkard schrieb:

    net schrieb:

    wie meinste das? irgendwie muss das ende doch erkannt werden. ob man nun eine 0 ans ende packt oder irgendwo die länge speichert. beides ist 'nah an der maschine'

    sprach ich von anfang und länge?
    ich meine anfang und ende. und ein zwei-zeiger-großes objekt wird immer übergeben, nicht mehr nur ein zeiger.

    naja, da nehm ich doch besser einen pointer und eine längenangabe (int). ist in vielen fällen irgendwie sparsamer und 'maschinennäher' als 2 pointers



  • net schrieb:

    naja, da nehm ich doch besser einen pointer und eine längenangabe (int). ist in vielen fällen irgendwie sparsamer und 'maschinennäher' als 2 pointers

    und übergibst auch 2*sizeof(void*)? dann isses recht egal, was man nimmt.



  • volkard schrieb:

    net schrieb:

    naja, da nehm ich doch besser einen pointer und eine längenangabe (int). ist in vielen fällen irgendwie sparsamer und 'maschinennäher' als 2 pointers

    und übergibst auch 2*sizeof(void*)?...

    wozu sollte ich?
    btw: auch wenn man's mal gebrauchen könnte, muss man '2*sizeof(void*)' nicht übergeben, weils konstant ist



  • net schrieb:

    eine längenangabe (int)

    dafür gibt es doch size_t 🙂 bzw. std::size_t, wenn wir schon bei C und C++ unterschieden sind 😉



  • net schrieb:

    wozu sollte ich?

    weil's einfach schneller ist, du weihnachtsmann. stell dir vor, du mappst ein file ins ram, macht davon mit nem tokenizer lauter zeilen, machst aus den zeilen mit noch nem tokenizer key-value-paare. ist ein string durch anfangs- und ende-zeiger oder anfang und länge gegeben, geht das ganz harmonisch ohne einmal daten der datei kopieren zu müssen.

    btw: auch wenn man's mal gebrauchen könnte, muss man '2*sizeof(void*)' nicht übergeben, weils konstant ist

    ach, red einfach nicht mit.


Anmelden zum Antworten