C-API mit Referenzparametern



  • Hi Community!

    Folgende Situation: Ich habe eine MSVC C++ DLL die nach aussen hin ein entsprechendes Interface (C++!) bereitstellt. Alle Symbole werden demangled exportiert und haben explizit eine __cdecl Calling Convention. Zudem sind alle verwendeten Typen C-Konform. Da allerdings Referenzparameter verwendet werden und ich jetzt doch eine voll C-Kompatible Schnittstelle bilden muss, bau ich das etwas um.

    Hier ein Beispiel wie das Interface aufgebaut ist:

    // SYMPUBLIC ist entweder __declspec(dllexport/-import), je nachdem
    // CALL ist __cdecl
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    SYMPUBLIC int CALL getFoo(int& foo);
    
    #ifdef __cplusplus
    }
    #endif
    

    Normalerweise müsste ich ja jetzt aus dem Referenzparameter einen Pointertype machen damit auch ein C was mit der Deklaration anfangen kann. Bevor ich jetzt aber anfange und mir die Arbeit mache auch meine ganzen .cpp Files anzupassen, die Lib ist nicht gerade klein, dachte ich mir ich bin ein ganz schlauer Fuchs und mache einfach das hier in meinen Headern draus:

    // REFCALL ist bei __cplusplus & und wenn nicht dann *
    // [...]
    
    SYMPUBLIC int CALL getFoo(int REFCALL foo);
    
    // [...]
    

    Die Aufrufe würden beim Consumer der Lib dann letztendlich so aussehen:

    // C++
    int foo;
    int error = getFoo(foo);
    
    // C
    int foo;
    int error = getFoo(&foo);
    

    Meiner Meinung nach wird meiner Lib in beiden Fällen dieselbe Adresse übergeben, und da die Symbole sowieso nicht gemangled sind funktioniert die Auflösung auch erste Klasse. WIE diese Adresse übergeben wurde sollte der Interna der Lib ja total schnuppe sein in diesem Szenario. Das einzige, logischerweise, ist die mögliche Übergabe eines NULL-Pointers, aber das ist aus meiner Sicht jetzt eigentlich nur das einzige Problem...

    Liege ich hier total falsch, oder ist das gar ein Standardweg für sowas? Wenn jemand Einwände hat, bitte sofort die rote Flagge heben 🙂

    Grüße
    PuerNoctis



  • Die ISO Standards erlauben so etwas nicht. Das Verhalten deiner Aktion ist dort nicht definiert.

    Dass es bei dir "klappt", ist jetzt aber auch nicht so verwunderlich. Ich würde sagen, du nutzt Implementierungsdetails aus. Details, die sehr nahe liegen.



  • Nimm doch auch in C++ Pointer? Spricht absolut nichts dagegen.



  • @Ethon
    Freilich nicht 😉
    Muss jetzt halt nur kurz die Zeit nehmen und in allen .cpp Files den Pointer dereferenzieren, und wenn ich schon dabei bin nullptr-Prüfungen einzubauen.

    Hat mich aber nur interessiert in wiefern sowas wie oben zulässig/möglich ist 🙂


Log in to reply