Apa itu __declspec dan kapan saya harus menggunakannya?


157

Saya telah melihat contoh __declspecdalam kode yang saya baca. Apa itu? Dan kapan saya harus menggunakan konstruk ini?


1
Jika Anda kurang beruntung dan pindah dari Linux ke Windows, Anda mungkin membuang waktu untuk mencari tahu mengapa DLL Anda tidak berfungsi, sampai Anda menemukan bahwa Anda harus menambahkan __declspec(dllexport)sebelum setiap fungsi di perpustakaan Anda
— SomethingSomething

Jawaban:


74

Ini adalah ekstensi spesifik Microsoft untuk bahasa C ++ yang memungkinkan Anda untuk menghubungkan tipe atau fungsi dengan informasi kelas penyimpanan.

Dokumentasi

__declspec (C ++)


19
Terima kasih - tetapi untuk apa saya menggunakannya?
— Scott J

4
Untuk mendeklarasikan antarmuka dan kelas COM, misalnya, Anda menggunakan __declspec (uuid), untuk mengekspor fungsi sans file DEF yang Anda gunakan __declspec (dllexport), dll. Daftar lengkapnya cukup panjang.
— Seva Alekseyev

1
@ScottJ Saya selalu menggunakannya untuk properti: __declspec (properti (get = X put = X)) pengidentifikasi tipe data. MSDN tentu saja memiliki lebih banyak perincian. Sebagai "C # to C / C ++ programmer" itu adalah kebahagiaan!
— MasterMastic

51

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)


8
@tetris, Anda tidak tahu dari kode. Keputusan dibuat oleh tautan, yang akan memilih yang pertama .libditemukannya yang memiliki simbol ekspor yang cocok.
— Euro Micelli

19

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 .


12

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 ++)


8

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.


1
Mengingat kompiler non-microsoft seperti GCC 4.2, yang menawarkan alternatif selain mereka __attribute__ ((dllexport))untuk __declspec(dllexport), apakah adil untuk panggilan __declspec, Microsoft hanya ekstensi?
— user2338150

0

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.