upnp in c



  • Hallo hatte mal vor einiger zeit eine funktion in c++ geschrieben, womit ich am router mit upnp einen port freischalten konnte.
    nun wollte ich das wieder machen, diesmal aber in einem c-programm.
    wie es aussieht ist der code aber nicht kompatibel da ich konvertierungs fehler bekomme. Hab in der libary gesehen das es c und c++ / code gibt nur weiss ich nicht wie ich klar mache das es c ist. wenn ich im projeklt auf c++ umstelle, lässt es sich kompileiern.



  • ein #undef __cplusplus lässt zwar den c-code sichtbar werden, ändert aber nix an den kopilierungsfehlern.


  • Mod

    C++ und C sind verschiedene Sprachen. Mit etwas Anpassung kann man zwar C-Programme auf einem C++-Compiler übersetzen (da C++, bis auf ein paar kleine Unterschiede, die Sprache C als Untermenge enthält), aber umgekehrt ist dies nicht möglich. Dafür muss der Code komplett auf C umgeschrieben werden. Dies ist prinzipiell immer möglich, die wahre Frage ist jedoch: Warum? Übersetz deine Funktion doch nach wie vor mit einem C++-Compiler. Wenn du eine zu C kompatible Schnittstelle erstellst, dann kannst du auch von C aus Funktionen aus in C++ geschriebenen Bibliotheken benutzen.



  • also in c++ sah es so aus

    IUPnPNAT *pNAT = 0;
    hrStaticPortMappingCollection = pNAT->get_StaticPortMappingCollection(0,&pStaticPortMappingCollection);
    

    da sagt er mir in dem c programm dann aber

    error C2039: 'get_StaticPortMappingCollection': Ist kein Element von 'IUPnPNAT'

    in der libary seh ich noch ein vtable

    CONST_VTBL struct IUPnPNATVtbl *lpVtbl;
    

    wenn ich das nutze sagt er das die paramter nicht stimmen da er als ersten para einen this zeiger will ?


  • Mod

    Memberfunktionen gibt es in C eben nicht. Die Funktion muss passend umgeschrieben werden*, was sicherlich noch einen ganzen Rattenschwanz an weiteren Änderungen nach sich ziehen wird.

    *: Die direkte Übersetzung einer Memberfunktion wäre eine freie Funktion, die zusätzlich einen Zeiger auf die Klasse (das ist in C++ der this-Zeiger) als Parameter hat.



  • *: Die direkte Übersetzung einer Memberfunktion wäre eine freie Funktion, die zusätzlich einen Zeiger auf die Klasse (das ist in C++ der this-Zeiger) als Parameter hat.[/quote]

    hm zeiger auf eine klasse ? auf welche klasse denn ? hab in c kein eklassen 🙂

    hab jetzt mal gegoogelt aber keien c alternative gefunden


  • Mod

    steff' schrieb:

    hab in c kein eklassen 🙂

    Na eben! Das Verhalten von (C++-)Klassen musst du mit (C-)structs und freien Funktionen nachbauen. Ich habe das Wort Klasse/Struct nicht weiter differenziert, weil der Begriff in C++ sowieso austauschbar ist und ich annahm, dass dir das bekannt ist.

    hab jetzt mal gegoogelt aber keien c alternative gefunden

    Wonach gegoogelt? Alternativen wofür?

    Und wieso willst du das ganze überhaupt in C haben, wenn du doch eine funktionierende C++-Lösung hast?

    SeppJ schrieb:

    Übersetz deine Funktion doch nach wie vor mit einem C++-Compiler. Wenn du eine zu C kompatible Schnittstelle erstellst, dann kannst du auch von C aus Funktionen aus in C++ geschriebenen Bibliotheken benutzen.



  • will es in einem alte c projekt hinjzufügen. hab es nun auch zusammengfeflickt danke für die tipps und denkanstösse 🙂 sollte noch wer probleme damit haben kann ich die änderungen hier posten. danke nochmal sepp 👍


Anmelden zum Antworten