011
11.12.2007, 22:40 Uhr
0xdeadbeef
Gott (Operator)
|
Das ist zwar richtig, aber wenn du einen C++-Typ zurückgibst, kann das Symbol ja schlecht in C-Form exportiert werden. In diesem Fall wird das extern "C" praktisch ignoriert (es gibt ein paar Feinheiten im Standard in Bezug auf Funktionszeiger, die sich aber in der Realität nicht auswirken).
Was du allerdings machen kannst, ist, einen void* zurückzugeben und ggf. halt umzucasten, also
C++: |
extern "C" void *get_http_instance(void*);
|
und dann in der Anwendung
C++: |
npm::http (*get_http_instance)(npm::logger *);
*(void **)(&get_http_instance) = dlsym(dll_handle, "get_http_instance");
|
Wenn man ganz spitzfindig ist, ist das zwar eeeeeigentlich nicht ganz zulässig, denn der Funktionszeiger müsste auch auf extern "C" getrimmt sein, in der Praxis sollte das aber bei allen Compilern funktionieren, denn aus Gründen der Einfachheit und Rückwärtskompatibilität werden C- und C++-Funktionen gleich aufgerufen. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra |