__declspec
adalah atribut khusus Microsoft yang memungkinkan Anda menentukan informasi kelas penyimpanan.
(Sudut Nitpicker: Namun, sejumlah vendor kompilator lain — misalnya GCC — sekarang mendukung ekstensi bahasa ini untuk kompatibilitas dengan basis kode terinstal yang ditulis menargetkan kompiler Microsoft. Beberapa bahkan menyediakan atribut kelas penyimpanan tambahan.)
Dua dari atribut kelas penyimpanan yang dapat ditentukan adalah dllimport
dan dllexport
. Ini menunjukkan kepada kompiler bahwa suatu fungsi atau objek diimpor atau diekspor (masing-masing) dari DLL.
Lebih khusus lagi, mereka mendefinisikan antarmuka DLL ke klien tanpa memerlukan file module-definition ( .DEF
). Kebanyakan orang merasa lebih mudah menggunakan ekstensi bahasa ini daripada membuat file DEF.
Untuk alasan yang jelas, __declspec(dllimport)
dan __declspec(dllexport)
umumnya dipasangkan satu sama lain. Anda gunakan dllexport
untuk menandai simbol yang diekspor dari DLL, dan Anda gunakan dllimport
untuk mengimpor simbol yang diekspor itu ke file lain.
Karena itu, dan karena file header yang sama umumnya digunakan baik saat menyusun DLL dan dalam kode klien yang menggunakan antarmuka DLL, itu adalah pola umum untuk menentukan makro yang secara otomatis menyelesaikan penentu atribut yang sesuai pada waktu kompilasi. Sebagai contoh:
#if COMPILING_DLL
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
Dan kemudian menandai semua simbol yang harus diekspor dengan DLLEXPORT
.
Agaknya, itulah yang dilakukan Q_CORE_EXPORT
makro, menyelesaikan ke salah satu Q_DECL_IMPORT
atau Q_DECL_EXPORT
.