C++ und Typesicherheit



  • Guten Tag.

    Man sagt ja immer c++ sei typesicher. was genau heißt das nun. das i/o-system von c++ solle typesicherer als von c (printf etc.) sein.

    Kann vielleicht einer erklären was es mit dem begriff typesicherheit auf sich hat und vielleicht auch beispiele geben wo das typesicher in c++ ist und in c nicht.

    danke schonmal.



  • http://en.wikipedia.org/wiki/Type_safety
    http://foldoc.org/index.cgi?strong+typing

    Ein wichtiger Unterschied zwischen C und C++ Typ-System verdeutlicht folgender Code

    struct A {
      int a;
    };
    
    struct B {
      double b;
    };
    
    int main() {
      struct A a;
      void *ptr = &a;
      struct B *b = ptr;
    }
    


  • rüdiger schrieb:

    http://en.wikipedia.org/wiki/Type_safety
    http://foldoc.org/index.cgi?strong+typing

    Ein wichtiger Unterschied zwischen C und C++ Typ-System verdeutlicht folgender Code

    struct A {
      int a;
    };
    
    struct B {
      double b;
    };
    
    int main() {
      struct A a;
      void *ptr = &a;
      struct B *b = ptr;
    }
    

    Vielen Dank. Die Links schaue ich mir gleich mal an.
    Die letzte anweisung würde in c++ nur mit einem static_cast funktionieren oder?
    Und ist das in c deswegen schlimm, weil ptr gar nicht auf einen struct A zeigen könnte und um in c++ die typesicherheit zu erzwingen deswegen ein static_cast hin muss? Und static_cast würde in c++ meckern wenn ptr nicht auf ein A zeigen sollte oder?

    🙂



  • Hast du auch ein beispiel für cout und printf, wo deutlich wird das cout sicherer/typesicherer ist?



  • int main() {
      double n = 10.0;
      printf("%s", n);
      // vs.
      cout << n;
    }
    

    Und static_cast würde in c++ meckern wenn ptr nicht auf ein A zeigen sollte oder?

    Nee.



  • Nö, das hat nichts mit dem Typsystem zu tun. printf funktioniert in C++ genau so typenunsicher wie in C, aber die Wirkungsmechanismen sind andere. cout wählt automatisch den korrekten Typ auf Basis der Templates, printf automatisch den gewünschten Typ auf Basis des Format-Strings. Der gesamte Template-Unterbau existiert in C aber überhaupt nicht, von daher ist der Vergleich hier etwas ... unpassend.

    rüdiger schrieb:

    Ein wichtiger Unterschied zwischen C und C++ Typ-System verdeutlicht folgender Code

    Ein wichtiger? Hast Du denn noch einen anderen? (Die automatische Wandlung von void-Zeigern ist übrigens ein in C absichtlich eingeführtes Loch im Typsystem.)



  • Daniel E. schrieb:

    Nö, das hat nichts mit dem Typsystem zu tun. printf funktioniert in C++ genau so typenunsicher wie in C, aber die Wirkungsmechanismen sind andere. cout wählt automatisch den korrekten Typ auf Basis der Templates, printf automatisch den gewünschten Typ auf Basis des Format-Strings. Der gesamte Template-Unterbau existiert in C aber überhaupt nicht, von daher ist der Vergleich hier etwas ... unpassend.

    Es wurde explizit nach einem Vergleich zwischen printf und cout gefragt.

    Daniel E. schrieb:

    rüdiger schrieb:

    Ein wichtiger Unterschied zwischen C und C++ Typ-System verdeutlicht folgender Code

    Ein wichtiger? Hast Du denn noch einen anderen? (Die automatische Wandlung von void-Zeigern ist übrigens ein in C absichtlich eingeführtes Loch im Typsystem.)

    Ja, der andere wichtige war das Casten zwischen verwandten Klassen. Gibts in C nämlich gar nicht. 😃



  • rüdiger schrieb:

    int main() {
      double n = 10.0;
      printf("%s", n);
      // vs.
      cout << n;
    }
    

    Und static_cast würde in c++ meckern wenn ptr nicht auf ein A zeigen sollte oder?

    Nee.

    Sorry meinte: Und static_cast würde in c++ meckern wenn ptr nicht auf ein B zeigen sollte oder?

    Und das in printf mit %s funktioniert für ein double oder wie ?

    Und gibt es noch andere wichtige codeteile wo man die typesicherheit von c++ gegenüber c sieht?



  • In dem Teil des Typsystems, der in C und C++ existiert (also Wandlung von Zeigern, structs und Elementartypen wie Integern oder doubles) gibt es genau einen Unterschied in der 'Strenge' der Typisierung, wenn man so will und das ist die unterschiedliche Behandlung des void-Zeigers.

    Das I/O-System ist ein ganz anderer Punkt, fputs als Vertreter für C funktioniert auch einwandfrei und 'typsicher'. printf funktioniert in C++ auch falsch. Das hat nichts mit der Strenge der Typisierung, sondern mit dem darunterliegenden Mechanismus zu tun. C kennt einfach keine Templates oder abgeleiteten Klassen, so etwas kann man also auch nicht bezüglich der Typenkorrektheit vergleich, weil C die Typen schon gar nicht kennt. Darum ist die Aussage, C++ sei typensicherer als C genaugenommen ziemlicher Unfug. Man hat in C++ nur andere Sprachmittel zur Verfügung, damit man mit Zeigerarithmetik oder Formatstrings nicht mehr rumwursteln muß, was evtl. Fehler vermeidet. Das macht C++ aber nicht zu einer streng typisierten Sprache -- das ist es nämlich einfach nicht.



  • neuman schrieb:

    Und das in printf mit %s funktioniert für ein double oder wie ?

    Eben nicht.



  • Daniel E. schrieb:

    In dem Teil des Typsystems, der in C und C++ existiert (also Wandlung von Zeigern, structs und Elementartypen wie Integern oder doubles) gibt es genau einen Unterschied in der 'Strenge' der Typisierung, wenn man so will und das ist die unterschiedliche Behandlung des void-Zeigers.

    Das I/O-System ist ein ganz anderer Punkt, fputs als Vertreter für C funktioniert auch einwandfrei und 'typsicher'. printf funktioniert in C++ auch falsch. Das hat nichts mit der Strenge der Typisierung, sondern mit dem darunterliegenden Mechanismus zu tun. C kennt einfach keine Templates oder abgeleiteten Klassen, so etwas kann man also auch nicht bezüglich der Typenkorrektheit vergleich, weil C die Typen schon gar nicht kennt. Darum ist die Aussage, C++ sei typensicherer als C genaugenommen ziemlicher Unfug. Man hat in C++ nur andere Sprachmittel zur Verfügung, damit man mit Zeigerarithmetik oder Formatstrings nicht mehr rumwursteln muß, was evtl. Fehler vermeidet. Das macht C++ aber nicht zu einer streng typisierten Sprache -- das ist es nämlich einfach nicht.

    Danke für die ausführliche Antwort.

    Mr. N schrieb:

    neuman schrieb:

    Und das in printf mit %s funktioniert für ein double oder wie ?

    Eben nicht.

    Und was ist dann an dem beispiel von rüdiger so besonders.

    Mein Frage lautete ja:

    neuman schrieb:

    Hast du auch ein beispiel für cout und printf, wo deutlich wird das cout sicherer/typesicherer ist?

    Und dann kam dieser Code:

    int main() {
      double n = 10.0;
      printf("%s", n);
      // vs.
      cout << n;
    }
    


  • Achso oder meinst du man könne %s für ein double nehmen und es kompiliert trotzdem was aber nicht sicher ist???



  • neuman schrieb:

    Achso oder meinst du man könne %s für ein double nehmen und es kompiliert trotzdem was aber nicht sicher ist???

    Richtig.



  • OK 🙂
    Wenn mich jetzt irgendwann einer mal fragen sollte:"C++ ist eine typesicher sprache. kannst du mir sagen was das genau bedeutet?"

    Wie könnt ich darauf am schönsten antworten ihn zwei kurzen sätzen oder ist das von Daniel E. schon die perfekte und kürzeste antwort drauf?



  • neuman schrieb:

    OK 🙂
    Wenn mich jetzt irgendwann einer mal fragen sollte:"C++ ist eine typesicher sprache. kannst du mir sagen was das genau bedeutet?"

    Wie könnt ich darauf am schönsten antworten ihn zwei kurzen sätzen oder ist das von Daniel E. schon die perfekte und kürzeste antwort drauf?

    Wie wärs damit:

    "C++ ist keine notwendigerweise typsichere Sprache, man kann es aber typsicher benutzen. Man kann also dafür sorgen, dass man Datenobjekte immer nur als solche mit kompatiblem Typen behandelt."



  • neuman schrieb:

    OK 🙂
    Wie könnt ich darauf am schönsten antworten ihn zwei kurzen sätzen oder ist das von Daniel E. schon die perfekte und kürzeste antwort drauf?

    solange du das typsystem nicht absichtlich aushebelst wird der compiler verhindern, dass du irgendeine schweinerei begehst.



  • Aja, danke für die zwei letzten antworten.
    Tolles Forum danke an alle. 👍


Anmelden zum Antworten