Jawaban:
Ini adalah ekstensi spesifik Microsoft untuk bahasa C ++ yang memungkinkan Anda untuk menghubungkan tipe atau fungsi dengan informasi kelas penyimpanan.
Dokumentasi
Contoh kanonik adalah __declspec(dllimport)
dan __declspec(dllexport)
, yang menginstruksikan penghubung untuk mengimpor dan mengekspor (masing-masing) simbol dari atau ke DLL.
// header
__declspec(dllimport) void foo();
// code - this calls foo() somewhere in a DLL
foo();
( __declspec(..)
hanya membungkus hal-hal spesifik Microsoft - untuk mencapai kompatibilitas, orang biasanya akan membungkusnya dengan makro)
.lib
ditemukannya yang memiliki simbol ekspor yang cocok.
Itu sebagian besar digunakan untuk mengimpor simbol dari / mengekspor simbol ke shared library (DLL). Baik dukungan kompiler Visual C ++ dan GCC __declspec(dllimport)
dan __declspec(dllexport)
. Penggunaan lain (hanya Microsoft) didokumentasikan dalam MSDN .
Contoh lain untuk menggambarkan kata kunci __declspec :
Ketika Anda menulis Driver Kernel Windows, kadang-kadang Anda ingin menulis sendiri urutan prolog / epilog Anda menggunakan kode assembler inline , sehingga Anda dapat mendeklarasikan fungsi Anda dengan atribut telanjang .
__declspec( naked ) int func( formal_parameters ) {}
Atau
#define Naked __declspec( naked )
Naked int func( formal_parameters ) {}
Silakan merujuk ke telanjang (C ++)
Pada dasarnya, ini adalah cara Microsoft memperkenalkan ekstensi C ++ sehingga tidak akan bertentangan dengan ekstensi standar C ++ di masa mendatang. Dengan __declspec, Anda dapat mengaitkan fungsi atau kelas; arti tepatnya bervariasi tergantung pada sifat __declspec. __declspec (telanjang), misalnya, menekan generasi prolog / epilog (untuk penangan interrupt, kode yang dapat disematkan, dll), __declspec (utas) membuat variabel thread-lokal, dan sebagainya.
Daftar lengkap atribut __declspec tersedia di MSDN, dan bervariasi menurut versi dan platform kompiler.
GCC 4.2
, yang menawarkan alternatif selain mereka __attribute__ ((dllexport))
untuk __declspec(dllexport)
, apakah adil untuk panggilan __declspec
, Microsoft hanya ekstensi?
Saya tahu sudah delapan tahun tetapi saya ingin membagikan potongan kode yang ditemukan di MRuby ini yang menunjukkan bagaimana __declspec()
lebah dapat digunakan pada tingkat yang sama dengan export keyword
.
/** Declare a public MRuby API function. */
#if defined(MRB_BUILD_AS_DLL)
#if defined(MRB_CORE) || defined(MRB_LIB)
# define MRB_API __declspec(dllexport)
#else
# define MRB_API __declspec(dllimport)
#endif
#else
# define MRB_API extern
#endif
__declspec(dllexport)
sebelum setiap fungsi di perpustakaan Anda