Ich habe ein C++ - Framework, in dem einige Berechnungen an (manchmal automatisch generierte) C-Funktionen oder C++ - Funktionen mit externer C-Verknüpfung delegiert werden. Dies sind Low-Level-Routinen, die sehr schnell und mit minimalem Overhead ausgewertet werden müssen. Sie befinden sich normalerweise in separaten gemeinsam genutzten Objekten/DLLs. Ihre aktuelle Signatur ist etwas entlang der Linien von:Kann ich FILE-Objekt über DLL-Grenzen übergeben?
int my_generated_function(const double* input, double* output, double* work);
, die in einer gemeinsamen Bibliothek befinden wird geladen mit dlopen
auf POSIX oder LoadLibrary
unter Windows. Die entsprechenden Funktionszeiger werden mit dlsym(handle, "my_generated_function")
unter POSIX oder GetProcAddress(handle, TEXT("my_generated_function"))
unter Windows extrahiert.
Ist es sicher und portabel, die Signatur mit einem FILE-Objektzeiger zu ergänzen?
int my_generated_function(const double* input, double* output, double* work,
FILE* logfile);
Beachten Sie, dass das gemeinsame Objekt my_generated_function
enthält, könnte mit einem anderen (aber binärkompatibel) Compiler als der Code kompiliert wurden, die das gemeinsame Objekt lädt.
Ich habe nicht impliziert, dass, wenn ich schrieb "C-Funktionen * oder * C++ Funktionen mit externen" C "Verknüpfung". Ich meinte, dass die Funktion entweder reiner C- oder C++ - Code ist. Im letzteren Fall hat es "extern" C "". – Joel
Ich würde sagen, es hängt von der Tatsache ab, ob die aufgerufene DLL mit der gleichen c-Laufzeit kompiliert wird wie der Aufruf von exe/dll –
@ArtemyVysotsky Was ist die Implikation davon? Was ist, wenn der Code zum Beispiel mit zwei verschiedenen Versionen des gleichen Compilers oder einer Kombination von 'gcc' und' clang' (die binärkompatibel sind) kompiliert wird? – Joel