Programm läuft in C, in C++ nicht mehr - Cast von int nach int*



  • Hallo,

    Ich habe ein bestehendes Programm, das in C geschrieben ist. Für dieses Programm soll ich eine Erweiterung in C++ schreiben. Damit beides zusammen läuft, muss ich auch das bisherige Programm mit einem C++-Compiler compilieren.

    Das Problem ist, dass mehrere Funktionen im Programm unterschiedlich deklariert und definiert sind. Bei der Deklaration der Funktionen im .h-File wird als Übergabeparameter einer Funktion "int" verwendet, in der Implementierung ist es "int*". Das Programm verwendet die Version mit "int" als Aufrufparameter. Ein C-Compiler gibt hier nur eine Warning aus, das Programm läuft aber korrekt.
    Der C++-Compiler meckert: "undefined reference...", klar, weil die Funktion im Programm mit "int" aufgerufen wird, aber in der Bibliothek mit "int*" versehen ist.
    Wenn man nun den Parameter in den Aufrufen der Funktion castet (& bzw. (int*)), läuft das Programm nicht mehr korrekt.

    Nun meine Frage: Wie kann ich den Aufrufparameter korrekt umwandeln, dass das Programm auch in C++ läuft?
    Dazu wäre es gut zu wissen, was C mit dem int-Parameter anstellt und wie das in C++ geht.

    Vielen Dank im Voraus!



  • fep2k schrieb:

    Damit beides zusammen läuft, muss ich auch das bisherige Programm mit einem C++-Compiler compilieren.

    Nein 🙂

    Das Problem ist, dass mehrere Funktionen im Programm unterschiedlich deklariert und definiert sind. Bei der Deklaration der Funktionen im .h-File wird als Übergabeparameter einer Funktion "int" verwendet, in der Implementierung ist es "int*". Das Programm verwendet die Version mit "int" als Aufrufparameter. Ein C-Compiler gibt hier nur eine Warning aus, das Programm läuft aber korrekt.
    Der C++-Compiler meckert: "undefined reference...", klar, weil die Funktion im Programm mit "int" aufgerufen wird, aber in der Bibliothek mit "int*" versehen ist.
    Wenn man nun den Parameter in den Aufrufen der Funktion castet (& bzw. (int*)), läuft das Programm nicht mehr korrekt.

    Nun meine Frage: Wie kann ich den Aufrufparameter korrekt umwandeln, dass das Programm auch in C++ läuft?
    Dazu wäre es gut zu wissen, was C mit dem int-Parameter anstellt und wie das in C++ geht.

    Kannst du die Parameter nicht ändern? Auch in C ist so etwas super super böse!



  • Zu dem Punkt, dass ich beides mit C++ compilieren muss:
    Wenn ich es nicht tue, bekomme ich beim Compilieren meines Programms "undefined references", weil in einer C-Bibliothek die Aufrufparameter nicht abgespeichert werden. Wie bekomme ich das denn sonst hin?

    Die Parameter könnte ich schon ändern, nur weiß ich eben nicht genau, was da passiert und wie ich die Parameter dann umwandeln soll. Wenn ich einfach draufloscode, läuft das Programm nicht mehr. Deshalb müsste ich genau wissen, was eine C-Funktion anstellt, wenn es statt einem int* einen int übergeben bekommt.

    Vielen Dank,

    Fabian



  • Vermutlich fehlt beim C++-kompilieren extern "C".

    Du solltest die auch von C++ genutzten Header-Datei um ein einleitendes

    #ifdef __cplusplus
    extern "C" {
    #endif
    

    und ein abschließendes

    #ifdef __cplusplus
    }
    #endif
    

    ergänzen.


Log in to reply