C vs. C++



  • Wieso kann man

    #include <stdlib.h>
    
    int main (void) {
      char* x = malloc(192);
      free(x);
    }
    

    mit C compilieren, aber nicht mit C++? Heißt es nicht immer, C++ sei ein striktes Superset von C?

    Okeh das war alles :3



  • Tönt nach Haus- oder Prüfungsaufgabe ...



  • Nö, ich versuche nur zu trollen. Mache ich es richtig?


  • Mod

    Ramelucke schrieb:

    Nö, ich versuche nur zu trollen. Mache ich es richtig?

    Nein, deine Orthografie ist viel zu gut und der Nutzername zu zahm¹.

    Und falls es tatsächlich erst sein sollte: Die Annahme, dass C++ ein striktes Superset von C wäre, ist vor allem eines: Strikt falsch. Was du zeigst ist das Paradebeispiel dafür und wird auch im C++-Standard - neben vielen anderen - als wichtigster Unterschied genannt.

    ¹: Alternativ zu provokanten Namen gehen auch Mädchennamen, wenn man trollen möchte.



  • SeppJ schrieb:

    ¹: Alternativ zu provokanten Namen gehen auch Mädchennamen, wenn man trollen möchte.

    z.B. Gisela, Lieselotte, Herzeleide oder Bumbee.



  • Ramelucke schrieb:

    Nö, ich versuche nur zu trollen. Mache ich es richtig?

    Richtig trollen geht so:

    Code, der malloc enthält, kann man mit einem C++ Compiler schon compilieren, allerdings muss man diesen dann mit einem Parameter aufrufen, der C malloc erlaubt.
    Dieser Paramter füht dann dazu, dass mit malloc reservierter Speicher für C Objekte verwendet werden kann, die kein Name mangling, wie bei C++ normalerweise üblich, verwenden.
    Dies erlaubt es dann, ein solches, mit einem C++ Compiler erstellte Binary mit einem anderen Binary zu linken, welches lediglich mit einem C Compiler compiliert wurde und diese C Objekte dann von dem anderen Binary aus zu verwenden und aufzurufen.
    Ein Feature, das bei echten C++ Objekten aufgrund des name nameglings von einem mit einem C Compiler compilierten Binary nicht geht.



  • Dann machen wirs halt noch ein bisschen netter:

    ??=include <stdlib.h>
    ??=include <stdio.h>
    
    int main (argc, argv)
      int argc;
      char* argv??(??);
    ??<
      char* x = malloc(192);
      191??(x??) = 0;
      printf("%s??/n", x);
      free(x);
    ??>
    


  • Als Troll muss man auch einen guten Sinn fuer Humor haben. Sonst ist man nicht trollig sondern unnoetig.



  • Liselucke schrieb:

    Dann machen wirs halt noch ein bisschen netter:

    Wie aus dem Lehrbuch (K&R 1. Edition)



  • Ramelucke schrieb:

    mit C compilieren, aber nicht mit C++? Heißt es nicht immer, C++ sei ein striktes Superset von C?

    bei mir kompiliert es mit c++;


  • Mod

    rapso schrieb:

    Ramelucke schrieb:

    mit C compilieren, aber nicht mit C++? Heißt es nicht immer, C++ sei ein striktes Superset von C?

    bei mir kompiliert es mit c++;

    Das darf es aber nicht; der Standard sagt sogar explizit, dass implizite Umwandlungen dann und nur dann geschehen dürfen, wenn sie gültig sind. Compiler? Compilerschalter?



  • Dir ist klar, das in C++, anders als in C, eine constraint violation nicht den Abbruch der Uebersetzung verlangt?


  • Mod

    Arcoth schrieb:

    Dir ist klar, das in C++, anders als in C, eine constraint violation nicht den Abbruch der Uebersetzung verlangt?

    Ich habe dazu extra in den Standard geguckt. Der sagt halt zwei Dinge:
    1. Wie eine "well-formed" Umwandlung aussieht. Wobei natürlich richtig ist, dass für nicht "well-formed" Programme eine Diagnosenachricht ausreichend ist, außer es wird explizit anders verlangt. Hier wird nichts anderes verlangt.
    2. Anderswo wird aber gesagt, dass eine Umwandlung dann und nur dann vorgenommen werden darf, wenn sie "well-formed" ist, aber ohne Angabe, was geschehen muss, wenn dies nicht gilt.

    Nichtsdestotrotz würde mich interessieren, welcher C++-Compiler das durchgehen lässt, denn das wäre schon eine recht krasse Aufweichung des Typensystems.



  • Arcoth schrieb:

    Dir ist klar, das in C++, anders als in C, eine constraint violation nicht den Abbruch der Uebersetzung verlangt?

    Das ist doch Nonsens.
    Ein standardkonformer C-Compiler muss bei einer constraint violation lediglich eine "Meldung" (in beliebiger Form) generieren.
    Ob der Compilerbauer dann anschließend diese "Meldung" intern als fatalen Fehler interpretiert und die Compilierung abbricht oder als nur Warnung und weitermacht ist nicht spezifiziert.



  • @SeppJ: Der relevante Text ist

    <a href= schrieb:

    [intro.compliance]/(2.2)">If a program contains a violation of any diagnosable rule or an occurrence of a construct described in this Standard as “conditionally-supported” when the implementation does not support that construct, a conforming implementation shall issue at least one diagnostic message.

    Ich habe keine Ahnung von welchem Paragraphen du in 2. redest; es wäre hilfreich wenn du ihn auch nennst 😛

    Was C angeht, hatte ich Unrecht, danke Wutz. Siehe 5.1.1.3/1.

    Nichtsdestotrotz würde mich interessieren, welcher C++-Compiler das durchgehen lässt, denn das wäre schon eine recht krasse Aufweichung des Typensystems.

    Ist GCC nicht extrem lax bei Zeigerkonvertierungen?


  • Mod

    Arcoth schrieb:

    Nichtsdestotrotz würde mich interessieren, welcher C++-Compiler das durchgehen lässt, denn das wäre schon eine recht krasse Aufweichung des Typensystems.

    Ist GCC nicht extrem lax bei Zeigerkonvertierungen?

    Eigentlich nicht. Mir wäre kein Compiler bekannt, der dies erlaubt, daher frage ich ja.


Anmelden zum Antworten