__declspec
è un attributo specifico di Microsoft che consente di specificare le informazioni sulla classe di archiviazione.
(Nitpicker's Corner: Tuttavia, un certo numero di altri fornitori di compilatori, ad esempio GCC, ora supportano questa estensione del linguaggio per la compatibilità con la base di codice installata che è stata scritta per i compilatori Microsoft. Alcuni forniscono anche attributi di classe di archiviazione aggiuntivi.)
Due di questi attributi della classe di archiviazione che possono essere specificati sono dllimport
e dllexport
. Indicano al compilatore che una funzione o un oggetto viene importato o esportato (rispettivamente) da una DLL.
Più specificamente, definiscono l'interfaccia della DLL con il client senza richiedere un file module-definition ( .DEF
). La maggior parte delle persone trova molto più facile usare queste estensioni di lingua piuttosto che creare file DEF.
Per ovvie ragioni, __declspec(dllimport)
e __declspec(dllexport)
sono generalmente accoppiati tra loro. Si utilizza dllexport
per contrassegnare un simbolo come esportato da una DLL e si utilizza dllimport
per importare il simbolo esportato in un altro file.
Per questo motivo e poiché lo stesso file di intestazione viene generalmente utilizzato sia durante la compilazione della DLL che nel codice client che utilizza l'interfaccia della DLL, è un modello comune definire una macro che si risolve automaticamente nell'identificatore di attributo appropriato in fase di compilazione. Per esempio:
#if COMPILING_DLL
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
E quindi contrassegnare tutti i simboli che dovrebbero essere esportati con DLLEXPORT
.
Presumibilmente, questo è ciò che fa la Q_CORE_EXPORT
macro, risolvendo in Q_DECL_IMPORT
o Q_DECL_EXPORT
.