__Declspec nedir ve ne zaman kullanmam gerekir?


157

Okuduğum __declspeckodda örnekleri gördüm . Bu ne? Ve bu yapıyı ne zaman kullanmam gerekir?


1
Şanssızsanız ve Linux'tan Windows'a taşındıysanız, __declspec(dllexport)kitaplığınızdaki her işlevden önce eklemeniz gerektiğini bulana kadar DLL'lerinizin neden işe yaramayacağını anlamaya çalışırken zaman kaybedebilirsiniz
SomethingSomething

Yanıtlar:


74

Bu, bir tür veya işlevi depolama sınıfı bilgileriyle ilişkilendirmenize olanak tanıyan C ++ dilinin Microsoft'a özgü bir uzantısıdır.

belgeleme

__declspec (C ++)


19
Teşekkürler - ama ne için kullanırım?
Scott J

4
COM arabirimlerini ve sınıflarını bildirmek için, örneğin, __declspec (uuid) işlevini kullanırsınız, işlevleri dışa aktarmak için __declspec (dllexport) vb. Kullandığınız bir DEF dosyasını salar. Tam liste oldukça uzundur.
Seva Alekseyev

1
@ScottJ Bunu sürekli olarak özellikler için kullanıyorum: __declspec (özellik (get = X put = X)) veri türü tanımlayıcısı. MSDN'de elbette daha fazla ayrıntı var. "C # C / C ++ programcısı" olarak bir mutluluk!
MasterMastic

51

Kanonik örnekleridir __declspec(dllimport)ve __declspec(dllexport)veya bir DLL ihracat ve ithalat (sırasıyla), bir sembol için bağlayıcı talimat olan.

// header
__declspec(dllimport) void foo();


// code - this calls foo() somewhere in a DLL
foo();

( __declspec(..)Microsoft'un belirli öğelerini tamamlar - uyumluluk elde etmek için genellikle makrolarla tamamlanır)


8
@tetris, koddan bilmiyorsun. Karar, .libeşleşen bir dışa aktarma sembolü bulunan ilk bulduğu bağlayıcı tarafından verilir .
Euro Micelli

19

Çoğunlukla sembolleri paylaşılan kitaplığa (DLL) aktarmak / vermek için kullanılır. Visual C ++ ve KİK derleyiciler destek Hem __declspec(dllimport)ve __declspec(dllexport). Diğer kullanımlar (yalnızca Microsoft'a özgü) MSDN'de belgelenmiştir .


12

__Declspec anahtar kelimesini gösteren başka bir örnek :

Bir Windows Çekirdek Sürücüsü yazarken, bazen satır içi montajcı kodunu kullanarak kendi prolog / epilog kod dizilerini yazmak istersiniz , böylece işlevinizi çıplak öznitelik ile bildirebilirsiniz .

__declspec( naked ) int func( formal_parameters ) {}

Veya

#define Naked __declspec( naked )
Naked int func( formal_parameters ) {}

Lütfen çıplak (C ++) 'a bakın


8

Temel olarak, Microsoft'un C ++ uzantılarını, bu şekilde gelecekteki standart C ++ uzantılarıyla çakışmayacak şekilde tanıtmasıdır. __Declspec ile bir işlev veya sınıf ilişkilendirebilirsiniz; kesin anlam __declspec'in doğasına bağlı olarak değişir. __declspec (çıplak), örneğin, prolog / epilog üretimini bastırır (kesme işleyicileri, katıştırılabilir kod, vb. için), __declspec (thread) değişken bir iş parçacığı yerelini vb. yapar.

__Declspec özniteliklerinin tam listesi MSDN'de bulunur ve derleyici sürümüne ve platforma göre değişir.


1
Gibi olmayan microsoft derleyiciler düşünüldüğünde GCC 4.2onların için, ek olarak bu teklif alternatifi __attribute__ ((dllexport))için __declspec(dllexport), bu çağrıya adil __declspecbir Microsoft sadece uzatma?
user2338150

0

Sekiz yıl geçtiğini biliyorum ama MRuby'de bulunan ve __declspec()arının aynı seviyede nasıl kullanılabileceğini gösteren bu kod parçasını paylaşmak istedim 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.