__declspec은 무엇이며 언제 사용해야합니까?


157

내가 __declspec읽는 코드에서 인스턴스를 보았습니다 . 무엇입니까? 이 구조를 언제 사용해야합니까?


1
운이 좋지 않고 Linux에서 Windows로 이동 한 경우 __declspec(dllexport)라이브러리의 각 기능 앞에 추가 해야 할 때까지 DLL이 작동하지 않는 이유를 알아내는 데 시간이 낭비 될 수 있습니다.
SomethingSomething

답변:


74

이것은 C ++ 언어에 대한 Microsoft 고유의 확장으로, 스토리지 클래스 정보를 사용하여 유형 또는 함수의 속성을 지정할 수 있습니다.

선적 서류 비치

__declspec (C ++)


19
고마워-하지만 내가 그것을 위해 무엇을 사용할 것인가?
Scott J

4
예를 들어 COM 인터페이스 및 클래스를 선언하려면 __declspec (uuid)를 사용하고 함수를 DEF 파일에서 내보내려면 __declspec (dllexport) 등을 사용하십시오. 전체 목록은 매우 깁니다.
Seva Alekseyev

1
@ScottJ 나는 속성에 지속적으로 사용합니다 : __declspec (property (get = X put = X)) 데이터 유형 식별자. MSDN에는 물론 자세한 내용이 있습니다. "C # -C / C ++ 프로그래머"로서 그것은 행복합니다!
MasterMastic

51

표준 예제는 __declspec(dllimport)및로 __declspec(dllexport), 링커에서 DLL로 (또는 각각) 심볼을 가져오고 내보내도록 지시합니다.

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


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

( __declspec(..)마이크로 소프트의 특정 내용을 마무리합니다. 호환성을 달성하기 위해 보통 매크로로 마무리합니다.)


8
@tetris, 당신은 코드에서 모른다. 링커가 결정을 .lib내립니다. 링커 는 일치하는 내 보낸 심볼이있는 첫 번째 를 찾습니다.
Euro Micelli

19

주로 심볼을 가져 오거나 심볼을 공유 라이브러리 (DLL)로 내보내는 데 사용됩니다. 비주얼 C ++ 및 GCC 컴파일러 지원 모두 __declspec(dllimport)__declspec(dllexport). 다른 용도 (일부 Microsoft 만 해당)는 MSDN에 문서화 되어 있습니다.


12

__declspec 키워드 를 설명하는 또 다른 예 :

Windows 커널 드라이버를 작성할 때 인라인 어셈블러 코드를 사용하여 고유 한 프롤로그 / 에필로그 코드 시퀀스를 작성하려고 하므로 벌거 벗은 속성으로 함수를 선언 할 수 있습니다 .

__declspec( naked ) int func( formal_parameters ) {}

또는

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

알몸 (C ++)을 참조하십시오


8

기본적으로 Microsoft가 C ++ 확장을 도입하여 향후 표준 C ++ 확장과 충돌하지 않도록합니다. __declspec을 사용하면 함수 또는 클래스를 특성화 할 수 있습니다. 정확한 의미는 __declspec의 특성에 따라 다릅니다. 예를 들어 __declspec (naked)은 프롤로그 / 에필로그 생성 (인터럽트 처리기, 포함 가능한 코드 등)을 억제하고 __declspec (thread)는 변수를 스레드 로컬로 만듭니다.

__declspec 특성의 전체 목록은 MSDN에서 사용할 수 있으며 컴파일러 버전 및 플랫폼에 따라 다릅니다.


1
같은 비 마이크로 소프트 컴파일러 고려하여 GCC 4.2자신에게뿐만 아니라 그 제공의 대안 __attribute__ ((dllexport))__declspec(dllexport), 그것은 전화에 공정한 __declspec마이크로 소프트 전용 확장?
user2338150

0

8 년이 지났다는 것을 알고 있지만 MRuby에서 발견 된이 코드를 공유하여 __declspec()꿀벌과 같은 수준에서 꿀벌을 어떻게 사용할 수 있는지 보여줍니다 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.