Template exportieren - Mögliche Alternative



  • Ja genau, das ist mir schon klar, deshalb dachte ich es gäbe da evtl. eine "Alternative" um dieses Problem zu lösen... Vollständiges Template im Header wäre natürlich eine, aber das gefällt mir garnicht... 😞

    Gibt´s noch irgendwelche anderen Wege, um das Problem zu "umgehen"?
    Ich muss nicht unbedingt einen finden, ich frage das aus reinem Interesse...



  • Zeig konkreten Code, dann kann man evtl. eine passende Loesung vorschlagen.



  • Die vollständige Definition eines Templates muss zur Compilezeit zur Verfügung stehen, da führt leider kein Weg vorbei.
    Das __declspec(dllexport) kommt mir komisch vor, was bezweckst du damit? Da schon der Linker keine Templates instanzieren kann, geht es zur Laufzeit erst recht nicht.



  • BspCode steht oben 😉
    Dachte damit sage ich dem Compiler, dass ich die entsprechende Funktion oder in diesem Fall die entsprechende Klasse in die Lib exportieren möchte? 😮



  • dllexport ist Windows-only und (wie der Name vermuten lässt) fürs exportieren aus DLLs gedacht. DLLs sind dynamische Bibliotheken, also das Gegenteil von statisch.



  • @Templ:
    Bei einer statischen Bibliothek wird anstatt einer *.exe Datei eine lib-Datei erzeugt. Du programmierst ganz normal, indem du in die Header die Deklarationen und in die Source-Dateien die Definitionen schreibst
    Wenn du die Bibliothek verwenden willst, musst du dem Compiler sagen, wo er die Deklarationen findest (also die Header Dateien). Diese includest du dann ganz normal.
    Dem Linker musst du dann auch noch sagen, wo er die Lib-Datei findest, aus dieser wird dann zusammen mit *.obj-Dateien deiner Sourcefiles die *.exe deines Programmes.
    Schreibe also ganz normal die Klasse in einen Header (weil die Templates verwendest musst du sie da ganz reinschreiben und nicht nur das, was man bei normalen Klassen benutzt). Mehr musst du in der Regel nicht tun.
    Und was soll eigentlich das extern C? Das ist reines C++, da brauchst du kein extern C, oder irre ich mich?



  • Captain Obvious schrieb:

    dllexport ist Windows-only und (wie der Name vermuten lässt) fürs exportieren aus DLLs gedacht. DLLs sind dynamische Bibliotheken, also das Gegenteil von statisch.

    👍

    @Nathan: Ist mir alles bekannt, trotzdem danke 😉
    Extern "C" wird, soweit ich weiß, vorallem wegen überladenen Funktionen, die C nicht kennt, verwendet, um somit "kompatibel" zu sein...

    Aber zum Thema zurück, ich glaube es ist geklärt, dass es da keine "Alternative" gibt.

    Danke euch 💡



  • Eher umgekehrt...
    Extern C ist für C++ Programme, die C Code verwenden, da die interne Signatur von C-Funktionen anders ist als die von C++ (wegen Überladung).



  • Okay, gut zu wissen 👍



  • namespace party
    {
        int foo(bar*, float);
    }
    

    würde eben vom Compiler zu etwas wie

    __party__foo_int_barp_float

    als Name verwurstet werden (in der Realität nicht so primitiv), damit die Funktion für den Linker eindeutig ist.

    extern "C" int foo(bar*, float);
    

    würde auch danach noch foo heißen.



  • Nathan schrieb:

    Eher umgekehrt...
    Extern C ist für C++ Programme, die C Code verwenden, da die interne Signatur von C-Funktionen anders ist als die von C++ (wegen Überladung).

    extern "C" kann auch in der Gegenrichtung verwendet werden, also wenn man in einer C++ Library eine Funktion definieren möchte, so dass sie aus einem C Programm aufgerufen werden kann.

    extern "C" bewirkt einfach nur dass die Bezeichner C-kompatibel dekoriert werden. Ob man die Bezeichner dann verwendet um etwas zu konsumieren oder zu exportieren ist egal.


Anmelden zum Antworten