non-pods über DLL-Grenzen herumreichen
-
Hallöle,
Bei meinem aktuellen Projekt versuche ich gerade, einen non-pod über eine DLL zu erzeugen. Die Signatur der Funktion sieht wie folgt aus:
extern "C" __declspec(dllexport) world::chunk generate(world::chunk::coords);
GCC schluckt das selbst mit -Wall anstandslos, aber MSVC beschwert sich:
warning C4190: 'generate' has C-linkage specified, but returns UDT 'world::chunk' which is incompatible with C
Ist diese Warnung berechtigt, oder liegt MSVC wieder einmal falsch?
Grüße,
PI
-
ja
-
kk
-
Ist diese Warnung berechtigt, oder liegt MSVC wieder einmal falsch?
ja
kk
Huch. Da fragt sich der telepathisch unbegabte Leser: Ja, was denn nun?
-
Eine Frage in der 2 Antwortmöglichkeiten stehen, kann man nicht mit "ja" beantworten.
-
Was für ein Zufall
-
@pi: Warum schreibst Du überhaupt extern "C" hin?
-
Ja, MSVC hat recht.
theta schrieb:
@pi: Warum schreibst Du überhaupt extern "C" hin?
Sehr gute Frage
-
Damit die Funktion gefunden wird, wenn ich sie laden möchte.
-
PI, was ist "world::chunk" denn für ein Typ? Wenn es eine Klasse ist, dann kann die natürlich von C aus nicht benutzt werden...
-
Ich rufe die Funktion über C++ auf... Daher dürfte es da kein Problem geben.
-
http://stackoverflow.com/questions/2505385/classes-and-static-variables-in-shared-libraries/2505528#2505528
http://eli.thegreenplace.net/2011/09/16/exporting-c-classes-from-a-dll/
http://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL
-
MSDN sagt: http://msdn.microsoft.com/en-us/library/1e02627y%28v=vs.71%29.aspx
'identifier1' has C-linkage specified, but returns UDT 'identifier2' which is incompatible with C
A function or pointer to function has a UDT (user-defined type, which is a class, structure, enum, union, or __value type) as return type and extern "C" linkage. This is legal if:
All calls to this function occur from C++.
The definition of the function is in C++.Damit kann ich das Problem lösen durch:
#pragma warning(disable: 4190)
-
314159265358979 schrieb:
Damit die Funktion gefunden wird, wenn ich sie laden möchte.
Dafür hast du doch dllexport!?
-
Das macht sie nur "public", aber durch extern "C" wird der Funktinsname nicht gemangelt.
-
Aber die Funktion returned einen Typ der in einem Namespace liegt!? In dem Moment ist C doch schon gestorben!?
-
Der Rückgabetyp ist dann aber nicht im exportierten Funktionsnamen enthalten...
-
N3242 schrieb:
Linkage from C++ to objects defined in other languages and to objects defined in C++ from other languages is implementation-defined and language-dependent.
-
Ich benutze die Lib aber nur in C++.
-