본문 바로가기

카테고리 없음

[Win32] __declspec 선언문

원본 출처 : http://no1rogue.blog.me/30095005844


- __declspec 선언문 : 함수에 대한 정보를 제공하는 선언문이다.

 

형식 :   __declspec (extended-attribute) declarator

 

-> 기억부류(storage class)에 관한 정보를 단순화, 표준화하는 역할을 한다. 표준 C++ 문법에는 원래 포함되어 있지 않으며 MS社에서 만든 확장 문법이다. 그리고 함수와 비슷한 형태를 보이지만 예약어. 즉, Keyword에 속한다.

 

 * extended-attribute (4종류)

  + thread; 변수에 사용. TLS(Thread Local Storage) 데이터로 지정 할 때 사용된다. TLS란 스레드 사용시, 프로세스 공용 데이터와 별도로 사용되어야 하는 스레드마다 개별적인 지역 데이터와 스택에 저장되는 것과 같은 단기적인 데이터가 아닌 장기적으로 보존해야 하는 경우 사용되는 데이터를 저장하는 방식을 말한다. TLS를 필요로 할 때 스레드 내에서 이 키워드를 넣어 __declspec를 사용하면 TLS를 만들 수 있다.

                      ex> __declspec(thread) int tlsData;

 

  + naked; 함수에 사용. 함수 생성 시 자동으로 생성되는 스택 프레임(Stack Frame)과 같은 접두(Prolog), 접미(Epilog) 코드를 생성하지 않기 위해 사용된다. 어셈블리 코드를 직접 작성하는 하드 코딩을 하는 경우 사용되며, 디바이스 드라이버를 작성시에도 주로 사용한다.

                     ex> __declspec(naked) void nakedFunc(int);

 

  + dllimport;  DLL에 있는 데이터, 오브젝트, 함수를 임포트 할 경우 사용된다. DLL을 이용할 모듈 에서 DLL 내에서 이런 문법(DLL 내부에서는 export로 되어 있다.)으로 선언된 함수를 사용하겠다는 선언이다.

                      ex> __declspec(dllimport) ioid importFunc(int) ;   //함수

 

  + dllexport; DLL에 있는 데이터, 오브젝트, 함수를 익스포트 할 경우 사용된다. 해당 DLL을 사용하는 실행 파일 혹은 다른 DLL 같은 모듈에게 해당 DLL이 정보를 명시적으로 알리는 역할을 한다. _export 키워드와 의미상 같으며 Win16에서 DEF로 Export로 함수를 등록했던 것을 대체하는 문법이기도하다.

                        ex> __declspec(dllexport) void importFunc(int)    //함수

                               {

                                          //...

                                }

 

 

<참고 - Windows API 정복>