Überladen / Überschreiben von Funktionen in C möglich?


  • Administrator

    +fricky schrieb:

    gibts schon: http://de.wikipedia.org/wiki/Embedded_C%2B%2B
    finden aber alle doof, selbst stroustrup.

    Nicht wirklich das, was ich gesagt habe. Nicht nur, dass hier ein anderer Standard genommen wird, es wird sogar Objektorientierung unterstützt. Ist es wirklich so schwer zu verstehen, was ich meine? 😕

    Naja, vielleicht sollte ich die Frage mal von einer anderen Richtung aus setzen. Wenn ich mich allerdings von der anderen Seite annähere, dann hat es nichts mehr mit C zu tun. Aber ich frage jetzt trotzdem mal:
    Wieso wird eigentlich unter C++ nicht auch prozedural programmiert? Man hat diese Möglichkeiten unter C++ genauso wie in C. Wieso verwenden die Leute C und nicht C++? Nur wegen dem ABI? Was sind die Vorteile von C bei der prozeduralen Programmierung gegenüber C++?

    Ich möchte hier keinen Flameware starten. Es interessiert mich wirklich einfach nur. Das ist eine Frage, welche ich mir schon lange stelle.

    Grüssli



  • Dravere schrieb:

    Was sind die Vorteile von C bei der prozeduralen Programmierung gegenüber C++?

    Ich möchte kurz anmerken, dass man natürlich auch in C objektorientiert programmieren kann (man muss halt nur auf Dinge wie Vererbung usw. verzichten). Ansonsten ist das aber eine interessante Frage und ich bin auf die Antworten gespannt.



  • _matze schrieb:

    objektorientiert programmieren kann (man muss halt nur auf Dinge wie Vererbung usw. verzichten)

    Brüller des Tages



  • Dravere schrieb:

    Was sind die Vorteile von C bei der prozeduralen Programmierung gegenüber C++?

    weil C++ gegenüber C keinen vorteil bringt, wenn man nicht objektorientiert programmieren will. C++ hat redundante 'features' wie referenzen (C hat schon pointer), doppelte dyn. speicherverwerwaltung (malloc/free vs. new/delete/delete[]), usw. funktions- und operatorüberladung, die kaum nutzen bringen, aber verwirrung stiften können. ausserdem die inkompatibilitäten zu bestehendem C-code (C|sizeof('a') != C++|sizeof('a')), der void* in C++ ist so ziemlich verkrüppelt, etc. deshalb macht es keinen sinn, nur das C in C++ zu benutzen.

    _matze schrieb:

    Ich möchte kurz anmerken, dass man natürlich auch in C objektorientiert programmieren kann...

    klar, aber ein durch und durch objektorientiertes programm, würde ich nicht in C coden wollen (ausser es muss sehr maschinennah sein). in C++ aber auch nicht.
    🙂



  • Ich habs gut, ich kann kein C++ programmieren, also kommt beim mir auch kein Mischmasch raus.
    🙂



  • Die, bei denen Mischmasch rauskommt, können auch kein C++ programmieren :p



  • c+++ noob schrieb:

    Ich habs gut, ich kann kein C++ programmieren, also kommt beim mir auch kein Mischmasch raus.
    🙂

    ich kann c++ grundlagen. mag aber c lieber :p

    - nur echt mit zweimal ascii 48



  • +fricky schrieb:

    gibts schon: http://de.wikipedia.org/wiki/Embedded_C%2B%2B
    finden aber alle doof, selbst stroustrup. 🙂

    Hmm, was haltet ihr von Objective C? Das wäre so eine Geschichte, die anders als C++ die C- Wurzeln nicht tangieren, aber ein Objektkonzept à la Smalltalk zuliefern würde. Kann man nutzen oder auch nicht. Dank MacOS X ist das sogar halbwegs verbreitet.
    Leider habe ich im embedded- Bereich keinen freien, brauchbaren Compiler dafür gefunden (stattdessen verstärkt C/C++, ich sehe schon die Zahl der Zombie- Projekte wachsen) und alleine zum Probieren schaff' ich mir nix dergleichen an.
    Hat jemand dazu schon Erfahrungen gesammelt 😕

    Bashar schrieb:

    Die, bei denen Mischmasch rauskommt, können auch kein C++ programmieren :p

    Das ist ein vernichtendes Urteil über viele Poster im C++- Forum, sei mal angemerkt ... 😉


  • Administrator

    +fricky schrieb:

    C++ hat redundante 'features' wie referenzen (C hat schon pointer), ...

    Das kann man wohl kaum als Argument bringen, da es so subjektiv ist.

    +fricky schrieb:

    ... doppelte dyn. speicherverwerwaltung (malloc/free vs. new/delete/delete[]), ...

    Ich sage immer wieder, dass ich keinen Mischmasch meine und ihr mixt die Sache immer wieder. Wieso wollt ihr die Sprachen immer mixen?

    +fricky schrieb:

    ... usw. funktions- und operatorüberladung, die kaum nutzen bringen, aber verwirrung stiften können.

    Wieder kein Argument, da es so extrem subjektiv ist.

    +fricky schrieb:

    ausserdem die inkompatibilitäten zu bestehendem C-code (C|sizeof('a') != C++|sizeof('a')), ...

    Man will ja auch keine Kompabilität. Es ging bei dieser Frage um, entweder rein prozedural in C oder rein prozedural in C++. Nichts dazwischen und nichts untereinander.

    +fricky schrieb:

    ... der void* in C++ ist so ziemlich verkrüppelt, ...

    Das ist höchstens ein Argument, wieso man nicht C mit einem C++ Kompiler verwenden sollte. Wobei so extrem schlimm verkrüppelt finde ich es nicht. Es werden schlicht ein paar implizite Cast nicht unterstützt.
    Wenn aber, wie in der zweiten Frage, die Trennung gemacht wird, also prozedural C mit C Kompiler gegenüber prozedural C++ mit C++ Kompiler, dann ist das Argument nichtig.

    +fricky schrieb:

    etc. deshalb macht es keinen sinn, nur das C in C++ zu benutzen.

    Finde ich nicht wirklich überzeugend. Aber du hast auch ein wenig neben meiner Frage durchgeantwortet. In meiner letzten Frage ging es um diesen Vergleich:
    - prozedural C mit C Kompiler
    - prozedural C++ mit C++ Kompiler

    Ich hoffe es ist jetzt verständlich, was ich eigentlich meinte. Ich kann gewisse Argument verstehen, wieso man kein prozedural C mit C++ Kompiler machen möchte, aber was ist das Argument gegen prozedural C++ mit C++ Kompiler? C++ hat viel mehr Möglichkeiten, auch für das prozedurale Programmieren. Wieso wird immer noch C genommen? Nur wegen ABI? Was gibt es noch, ausser subjektive Argumente?

    Grüssli



  • Dravere schrieb:

    C++ hat viel mehr Möglichkeiten, auch für das prozedurale Programmieren.

    und welche?
    🙂


  • Administrator

    +fricky schrieb:

    Dravere schrieb:

    C++ hat viel mehr Möglichkeiten, auch für das prozedurale Programmieren.

    und welche?
    🙂

    Wurden ja schon genannt: Referenzen, Überladung.
    Da wir uns aber jetzt in C++ befinden und nicht mehr C unter C++, dann können wir auch diese nennen:
    Namensraum, Templates, Standardbibliothek (ein std::vector oder sowas dürfte auch in der prozeduralen Programmierung sehr hilfreich sein).

    Und im nächsten Standard kommen da auch viele zusätzliche Möglichkeiten. In C++ wird immer objektorientiert programmiert. Aber wieso eigentlich? Und vor allem, wieso tun sich die C Programmierer sich immer mit ihrer untypisierten Sprache herumschlagen, wo eine Liste zur reinsten Qual wird. Du kannst in C++ genauso prozedural programmieren, aber die Hilfsmittel von C++ dazu nehmen. Was spricht dagegen?

    Grüssli



  • Dravere schrieb:

    +fricky schrieb:

    Dravere schrieb:

    C++ hat viel mehr Möglichkeiten, auch für das prozedurale Programmieren.

    und welche?
    🙂

    Wurden ja schon genannt: Referenzen, Überladung.

    welchen Vorteil hast du bei Referenzen, den du bei Zeigern nicht hast? Um ehrlich zu sein, ich sehe nur Nachteile.

    2. Ich wüsste nicht, wo außerhalb der Objektorientierung Überladung gut wäre. Außerdem führt in meinen Augen Überladung mehr zur Verwirrung als zur Hilfestellung, die ABI wird unnötig komplizierter, was die Kompabilität auch gefährden kann, ich denke z.b. an dem Unstig von gcc-2.x auf gcc-3.x und wieder auf gcc-4.x. Alle C++ Programme mussten neu kompiliert werden, super.

    _matze schrieb:

    Ich möchte kurz anmerken, dass man natürlich auch in C objektorientiert programmieren kann (man muss halt nur auf Dinge wie Vererbung usw. verzichten).

    und ich möchte kurz anmerken, dass Vererbung auch möglich ist. GTK+ macht es.



  • Dravere schrieb:

    Wurden ja schon genannt: Referenzen, Überladung.

    wurde auch schon genannt: referenzen sind sinnlos, wo es pointer gibt. über überladung kann man geteilter meinung sein. ich bin der meinung, dass überladung mehr schaden anrichten kann, als dass es hilft.

    Dravere schrieb:

    Templates, Standardbibliothek (ein std::vector oder sowas dürfte auch in der prozeduralen Programmierung sehr hilfreich sein).

    std::vector, stl und der ganze template-bloat ist in umgebungen, wo heute C eingesetzt wird, oft nicht erwünscht. leg' auf 'nem embedded system ein paar stl-instanzen an und der speicher ist voll. C ist dagegen wesentlich ressourcenschonender.

    Dravere schrieb:

    Und vor allem, wieso tun sich die C Programmierer sich immer mit ihrer untypisierten Sprache herumschlagen...

    C ist genau so gut (oder schlecht) typisiert wie C++.

    Dravere schrieb:

    ... wo eine Liste zur reinsten Qual wird.

    macht du witze? unter C kann man sogar komplette SQL-datenbanksysteme (die selber in C geschrieben sind) in den eigenen code einbetten. und du meinst, 'ne liste wäre eine echte schwierigkeit?

    Dravere schrieb:

    Du kannst in C++ genauso prozedural programmieren, aber die Hilfsmittel von C++ dazu nehmen. Was spricht dagegen?

    diese vermeintlichen 'hilfsmittel' helfen überhaupt nicht. der einzige vorteil von C++ gegenüber C ist die eingebaute objektorientierung. aber selbst wenn man OO nutzen möchte, stellt sich die frage, ob man überhaupt C++ verwenden sollte. ich meine, es gibt *immer* bessere alternativen als C++.
    🙂



  • +fricky schrieb:

    diese vermeintlichen 'hilfsmittel' helfen überhaupt nicht. der einzige vorteil von C++ gegenüber C ist die eingebaute objektorientierung. aber selbst wenn man OO nutzen möchte, stellt sich die frage, ob man überhaupt C++ verwenden sollte. ich meine, es gibt *immer* bessere alternativen als C++.

    Jetzt habt ihr meinen letzten Post "overflamed" (S.6u), was haltet ihr von Objective C? Sieht doch auf den ersten Blick netter aus als C++ - oder?


  • Administrator

    @supertux,
    Ich hatte gefragt, wo es ausser in der ABI und in subjektiven Meinungen Nachteile gibt. 😉

    @fricky+,
    Überzeugt mich nicht wirklich, was du da schreibst. Liest sich mehr, wie jemand der eine Abneigung gegen C++ hat 🙂
    Was wirklich interessant wäre, sind Testberichte von Leuten, welche es ernsthaft versucht haben. Sowas muss es doch geben irgendwo im weiten Netz? Irgendwann hat sich doch sicher ein Student oder jemand anderes dies probiert? Es kommt mir nämlich wie mit der Programmierung von Treibern oder Betriebsystemen vor. Seit ich an der Uni bin, sagt mir jeder Professor, dass dies nur in C möglich sei und in C++ ein Ding der Unmöglichkeit. Wenn ich nachfrage wieso und ob es jemand denn schon mal probiert hätte, dann bekomme ich nur irgendwelche pauschalen Antworten. Bisher habe ich schlicht das Gefühl, dass es noch nie jemand ernsthaft versucht hat, sondern alle haben immer von vornherein aufgegeben.

    Grüssli



  • pointercrash() schrieb:

    Hmm, was haltet ihr von Objective C?

    Ich persönlich finde die Sprache interessant und irgendwie sympatisch. Für laufzeitkritische Anwendungen (bzw. Programmteile) aber wahrscheinlich nicht wirklich interessant (Stichwort immer dynamic dispatch bei message passing).

    pointercrash() schrieb:

    Leider habe ich im embedded- Bereich keinen freien, brauchbaren Compiler dafür gefunden

    Ich weiss nicht ob du die gcc als brauchbar ansiehst, aber da sollte neben dem C-compiler auch ein objC-Compiler mit rausfallen (wenn er denn mitgebaut wird, woran es wohl scheitert...).



  • pointercrash() schrieb:

    was haltet ihr von Objective C? Sieht doch auf den ersten Blick netter aus als C++ - oder?

    ja, ist 'ne ziemlich runde sache. leider braucht's 'ne laufzeitumgebung, um die messages durch die gegend zu scheuchen, was auf unserem anwendungsgebiet zuviel ressourcen schlucken könnte.

    Dravere schrieb:

    Liest sich mehr, wie jemand der eine Abneigung gegen C++ hat

    das war ja auch nicht schwer zu erraten.

    Dravere schrieb:

    Es kommt mir nämlich wie mit der Programmierung von Treibern oder Betriebsystemen vor. Seit ich an der Uni bin, sagt mir jeder Professor, dass dies nur in C möglich sei und in C++ ein Ding der Unmöglichkeit.

    ach, möglich isses schon. kennste singularity? das ist sogar in C# geschrieben (auf unterster ebene mit etwas C und assembler). zeig das mal deinem prof.

    Dravere schrieb:

    Wenn ich nachfrage wieso und ob es jemand denn schon mal probiert hätte, dann bekomme ich nur irgendwelche pauschalen Antworten.

    ich kenne einige beispiele aus der praxis, in der leute mit C++ schnell an die grenzen ihrer hardware kamen. meine persönlich faustformel lautet: ab etwa 1MB RAM und 1MB ROM könnte man es mit C++ wagen. ich würde es aber trotzdem nicht tun (siehe oben, abneigung und so).
    🙂



  • _matze schrieb:

    Dravere schrieb:

    Was sind die Vorteile von C bei der prozeduralen Programmierung gegenüber C++?

    Ich möchte kurz anmerken, dass man natürlich auch in C objektorientiert programmieren kann (man muss halt nur auf Dinge wie Vererbung usw. verzichten). Ansonsten ist das aber eine interessante Frage und ich bin auf die Antworten gespannt.

    Erstmal, seit wann muss man auf Vererbung in C verzichten?

    Und zweitens, welchen Vorteil bringt es prozedural zu programmieren? Bis auf den Code in den Methoden habe ich schon seit 10 Jahren nicht prozedural programmiert.

    Aber mal eine Frage in die Runde, wieso ist Ueberladung immer nur Funktionsparameter und nicht auch noch der Rueckgabetyp? Also z.B.:

    void f(float x) { }
    
    float f(float x) { }
    
    string f(float x) { }
    
    f(5.0f);
    float y = f(5.0f);
    string str = f(5.0f);
    


  • DEvent schrieb:

    Erstmal, seit wann muss man auf Vererbung in C verzichten?

    was willste in C vererben? structs in structs packen oder wie?

    DEvent schrieb:

    Und zweitens, welchen Vorteil bringt es prozedural zu programmieren?

    den vorteil, dass man sicht nicht mit oop-konzepten rumschlagen muss, wo es nicht nötig ist.
    🙂



  • +fricky schrieb:

    DEvent schrieb:

    Erstmal, seit wann muss man auf Vererbung in C verzichten?

    was willste in C vererben? structs in structs packen oder wie?

    DEvent schrieb:

    Und zweitens, welchen Vorteil bringt es prozedural zu programmieren?

    den vorteil, dass man sicht nicht mit oop-konzepten rumschlagen muss, wo es nicht nötig ist.
    🙂

    struct Base {
           ...
        }
    
        struct Derived {
           struct Base parent;
           ...
        }
    

    Gibt auch noch bessere Beispiele, auch mit Kapselung, Ctors, Dtors usw.

    Man kann oft auf inheritance oder polymorphism verzichten, die anderen features sind immer praktisch, auch fuer kleine Projekte.


Anmelden zum Antworten