__declspec
ist ein Microsoft-spezifisches Attribut, mit dem Sie Informationen zur Speicherklasse angeben können.
(Nitpicker's Corner: Einige andere Compiler-Anbieter - z. B. GCC - unterstützen diese Spracherweiterung jetzt, um die Kompatibilität mit der installierten Codebasis zu gewährleisten, die für Microsoft-Compiler geschrieben wurde. Einige bieten sogar zusätzliche Speicherklassenattribute.)
Zwei dieser Speicherklassenattribute, die angegeben werden können, sind dllimport
und dllexport
. Diese zeigen dem Compiler an, dass eine Funktion oder ein Objekt aus einer DLL importiert bzw. exportiert wird.
Insbesondere definieren sie die Schnittstelle der DLL zum Client, ohne dass eine module-definition ( .DEF
) -Datei erforderlich ist . Die meisten Leute finden es viel einfacher, diese Spracherweiterungen zu verwenden, als DEF-Dateien zu erstellen.
Aus offensichtlichen Gründen __declspec(dllimport)
und __declspec(dllexport)
sind in der Regel miteinander gepaart. Sie dllexport
markieren ein Symbol als aus einer DLL exportiert und dllimport
importieren dieses exportierte Symbol in eine andere Datei.
Aus diesem Grund und weil im Allgemeinen dieselbe Header-Datei sowohl beim Kompilieren der DLL als auch im Client-Code verwendet wird, der die DLL-Schnittstelle verwendet, ist es ein gängiges Muster, ein Makro zu definieren, das beim Kompilieren automatisch in den entsprechenden Attributbezeichner aufgelöst wird. Beispielsweise:
#if COMPILING_DLL
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
Markieren Sie dann alle Symbole, mit denen exportiert werden soll DLLEXPORT
.
Vermutlich ist es das, was das Q_CORE_EXPORT
Makro tut, indem es entweder Q_DECL_IMPORT
oder auflöst Q_DECL_EXPORT
.