C++ zu C Converter?



  • danke, das macht was ich will und an goto hab ich mich eh schon gewöhnt 😉



  • Ist der Code nach sowas noch Compilierbar?^^



  • Sonst wäre es irgendwie nicht sinnvoll, oder?


  • Mod

    😮 schrieb:

    Ist der Code nach sowas noch Compilierbar?^^

    So eine Wahnisnnsumänderung ist das nun auch nicht. Du musst alle Klassen zu structs machen und ihre Member zu freien Funktionen machen, Überladungen explizit auflösen (an Operatoren denken!) und Templates instanzieren. Das war's dann auch schon*. Im Prinzip macht jeder C++-Compiler diese Schritte schon, denn genau dies kommt hinterher beim Linker an. Bloß gibt es eben nicht die Option, das zwischendurch in C-Code umzuwandeln, es wird eben direkt compiliert.

    *: Je nach Version des jeweiligen Sprachstandards kommen noch kleine Unterschiede wie die Position von Variablendeklarationen oder die Bedeutung von auto hinzu.



  • Gibt es bei den Objective-C-Compilern nicht diese Option sogar noch, sich den C-Code anzusehen?



  • SeppJ schrieb:

    😮 schrieb:

    Ist der Code nach sowas noch Compilierbar?^^

    So eine Wahnisnnsumänderung ist das nun auch nicht. Du musst alle Klassen zu structs machen und ihre Member zu freien Funktionen machen, Überladungen explizit auflösen (an Operatoren denken!) und Templates instanzieren. Das war's dann auch schon*. Im Prinzip macht jeder C++-Compiler diese Schritte schon, denn genau dies kommt hinterher beim Linker an. Bloß gibt es eben nicht die Option, das zwischendurch in C-Code umzuwandeln, es wird eben direkt compiliert.

    *: Je nach Version des jeweiligen Sprachstandards kommen noch kleine Unterschiede wie die Position von Variablendeklarationen oder die Bedeutung von auto hinzu.

    Wie werden denn Exceptions übersetzt?


  • Mod

    Werirgend schrieb:

    Wie werden denn Exceptions übersetzt?

    Guter Punkt, ganz vergessen. 👍

    Mit longjmp und setjmp. Damit bekommt man auch (relativ einfach) die garantierten Automatismen beim Aufräumen des Stacks hin.

    Berühmt berüchtigt sind Strukturen wie hier:
    http://code.google.com/p/cii/ (except.h und except.c)
    Da macht er mittels Makros das Exceptionsystem von Java nach. Speziell für C++ kann ich gerade kein konkretes Beispiel finden, aber es ist klar, dass das ähnlich läuft. Man könnte natürlich wieder mit den nachgemachten Exceptions im Java-Style wiederum Exceptions im C-Style nachmachen. :xmas2:

    Wenn man den Code hinterher anguckt, wird das jedoch wirklich unleserlich (aber selbstverständlich noch compilierbar), daher macht auch niemand Exceptions in C von Hand, außer eben mit solchen Makros.

    P.S.: Das heißt nicht, dass die Exceptions durch einen C++-Compiler unbedingt so umgesetzt werden müssen. Der C++-Compiler hat schließlich den vollen Überblick und braucht keinen C-Zwischencode zu erzeugen. Er kann daher auch ganz andere Techniken benutzen, die in C nicht so "einfach" :xmas1: durch Makros nachprogrammierbar wären.



  • llvm_cbe_tmp__3 = __cxa_allocate_exception(4ull);
    unsigned char *__cxa_begin_catch(unsigned char *);
    void __cxa_end_catch(void);
    __cxa_throw(llvm_cbe_tmp__5, ((unsigned char *)(&_ZTIi)), ((void  (*) (unsigned char *))/*NULL*/0));
    

    so vllt. 😕



  • das kann doch garnicht funktionieren oder 😃 wie soll an denn dann sowas wie lokale klassen und sowas machen?


  • Mod

    gamer8o4 schrieb:

    das kann doch garnicht funktionieren oder 😃 wie soll an denn dann sowas wie lokale klassen und sowas machen?

    Wo ist das Problem? Eine Übersetzung C++ nach C ist ein C-Programm, welches das exakt gleiche Verhalten wie das C++-Programm zeigt, nicht eine C-Programmiertechnik, die das gleiche Verhalten wie eine bestimmte C++-Technik zeigt.

    Und wen interessiert das überhaupt noch, drei Monate nachdem die Frage beantwortet wurde?


Anmelden zum Antworten