__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 dllimporte 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 dllexportper contrassegnare un simbolo come esportato da una DLL e si utilizza dllimportper 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_EXPORTmacro, risolvendo in Q_DECL_IMPORTo Q_DECL_EXPORT.