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.