PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++: Doppelte Klassenangabe?


mekakic
2008-08-05, 15:23:39
Ich bin gerade etwas verwirrt über eine Klassendefinition, die mir so noch nicht begegnet ist ... zumindest nicht in letzter Zeit :)

Was bedeutet dies (http://poco.svn.sourceforge.net/viewvc/poco/poco/trunk-1.2/Foundation/include/Poco/Notification.h?view=markup):
class Foundation_API Notification: public RefCountedObject
Notification ist die Klasse, aber was ist Foundation_API? Das ist die Library, aber warum steht das in der Klassendefinition.

Expandable
2008-08-05, 16:31:27
Das ist wahrscheinlich ein Makro für den dll export.

Ectoplasma
2008-08-05, 16:51:23
Ich bin gerade etwas verwirrt über eine Klassendefinition, die mir so noch nicht begegnet ist ... zumindest nicht in letzter Zeit :)

Was bedeutet dies (http://poco.svn.sourceforge.net/viewvc/poco/poco/trunk-1.2/Foundation/include/Poco/Notification.h?view=markup):
class Foundation_API Notification: public RefCountedObject
Notification ist die Klasse, aber was ist Foundation_API? Das ist die Library, aber warum steht das in der Klassendefinition.

Das bedeutet, falls du Poco als DLL benutzen möchtest, dass beim Compilieren der Poco DLL, jede Klasse mit dem Makro 'Foundation_API', exportiert wird.

Wenn du die Poco DLL benutzen möchtest, dann werden alle Klassen mit dem Makro 'Foundation_API', importiert.


#if defined(Foundation_EXPORTS)
#define Foundation_API __declspec(dllexport)
#else
#define Foundation_API __declspec(dllimport)
#endif


Übrigens kann man Klassen auch ohne __declspec(dllexport) und __declspec(dllimport), ex- oder importieren. Das ist aber eine lange Geschichte und würde den Rahmen hier sprengen. Die beiden Keywords sind übrigens eine Spezialität von Microsoft. Jeder C++ Compiler für Windows beherrscht diese.

TheGamer
2008-08-05, 16:53:05
Das ist wahrscheinlich ein Makro für den dll export.

Ja genau

Vermutlich steht irgendwo eine praeprocessor anweisung

#define Foundation_API __declspec( dllexport )

Bei windows C++ compilern zumindest

Linux oder Unixe haben keine symbol import export direktiven


EDIT: steht btw in der Foundation.h von POCO



69 #if defined(_WIN32) && defined(POCO_DLL)
70 #if defined(Foundation_EXPORTS)
71 #define Foundation_API __declspec(dllexport)
72 #else
73 #define Foundation_API __declspec(dllimport)
74 #endif
75 #endif



SVN: http://poco.svn.sourceforge.net/viewvc/poco/poco/trunk-1.2/Foundation/include/Poco/Foundation.h?view=markup

Coda
2008-08-05, 17:12:22
Linux oder Unixe haben keine symbol import export direktiven
Doch haben sie. Das ist komplett compilerspezifisch.

GCC macht das inzwischen auch um die Export-Tables nicht mit allem zuzumüllen.

Ectoplasma
2008-08-05, 17:23:16
GCC macht das inzwischen auch um die Export-Tables nicht mit allem zuzumüllen.

Wie geht das denn bei UNIX? Kenne mich da gar nicht so aus.

TheGamer
2008-08-05, 19:16:45
Doch haben sie. Das ist komplett compilerspezifisch.

GCC macht das inzwischen auch um die Export-Tables nicht mit allem zuzumüllen.

ah ok danke fuer die infos.

hast du links wo man sich darueber informieren kann?

Coda
2008-08-05, 19:33:21
http://gcc.gnu.org/wiki/Visibility

TheGamer
2008-08-05, 20:48:46
http://gcc.gnu.org/wiki/Visibility

seid gedankt

mekakic
2008-08-07, 15:27:26
Danke, hätte ich zwar auch selber drauf kommen können... aber so ist das eben immer.