Odpowiedzi:
Jest to rozszerzenie języka C ++ specyficzne dla firmy Microsoft, które umożliwia przypisanie typu lub funkcji do informacji o klasie pamięci.
Dokumentacja
Przykłady kanoniczne to __declspec(dllimport)i __declspec(dllexport), które instruują konsolidator, aby importował i eksportował (odpowiednio) symbol z lub do biblioteki DLL.
// header
__declspec(dllimport) void foo();
// code - this calls foo() somewhere in a DLL
foo();
( __declspec(..)po prostu podsumowuje specyficzne rzeczy Microsoftu - aby osiągnąć kompatybilność, zwykle pakuje się to w makra)
.libznaleziony, który ma pasujący wyeksportowany symbol.
Jest używany głównie do importowania symboli z / eksportowania symboli do biblioteki współdzielonej (DLL). Kompilatory Visual C ++ i GCC obsługują __declspec(dllimport)i __declspec(dllexport). Inne zastosowania (tylko niektóre firmy Microsoft) są udokumentowane w witrynie MSDN .
Kolejny przykład ilustrujący __declspec kluczowe :
Kiedy piszesz sterownik jądra systemu Windows, czasami chcesz napisać własne sekwencje kodu prologu / epilogu przy użyciu wbudowanego kodu asemblera , więc możesz zadeklarować swoją funkcję z atrybutem naked .
__declspec( naked ) int func( formal_parameters ) {}
Lub
#define Naked __declspec( naked )
Naked int func( formal_parameters ) {}
Proszę odnieść się do nagiego (C ++)
Zasadniczo jest to sposób, w jaki Microsoft wprowadza swoje rozszerzenia C ++, aby nie kolidowały z przyszłymi rozszerzeniami standardowego C ++. Dzięki __declspec możesz przypisać funkcję lub klasę; dokładne znaczenie zależy od charakteru __declspec. __declspec (nagi), na przykład, pomija generowanie prologu / epilogu (dla programów obsługi przerwań, kodu możliwego do osadzenia itp.), __declspec (wątek) tworzy zmienną lokalną wątku i tak dalej.
Pełna lista atrybutów __declspec jest dostępna w witrynie MSDN i różni się w zależności od wersji kompilatora i platformy.
GCC 4.2, które oferują alternatywę oprócz ich __attribute__ ((dllexport))do __declspec(dllexport), jest to fair w stosunku do wywołania __declspec, Microsoft tylko rozszerzenie?
Wiem, że minęło osiem lat, ale chciałem udostępnić ten fragment kodu znaleziony w MRuby, który pokazuje, jak __declspec()można używać pszczoły na tym samym poziomie co 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)przed każdą funkcją w swojej bibliotece