2009-12-07 2 views
1

오픈 소스 프로젝트를 이해하려고합니다. 다음 클래스 선언을 보았습니다.왜 Windows에서 C++ 클래스 정의가 '클래스'다음에 매크로 토큰을 갖는지?

class STATE_API AttributeSubject : public AttributeGroup, public Subject 
{ 
public: 
    AttributeSubject(const char *); 
    virtual ~AttributeSubject(); 
    virtual void SelectAll() = 0; 
    virtual const std::string TypeName() const; 
    virtual void Notify(); 
    virtual AttributeSubject *CreateCompatible(const std::string &) const; 
    virtual AttributeSubject *NewInstance(bool copy) const { return 0; }; 

    virtual bool VarChangeRequiresReset(void) { return false; }; 
}; 

클래스 이름 AttributeSubject가 나타 내기 전에 STATE_API는 무엇을 의미합니까? 어떤 종류의 매크로입니까?

답변

9

아마도 __declspec (dllimport) 또는 __declspec (dllexport)의 typedef이며 Windows 플랫폼의 DLL에서 클래스를 내보내는 데 사용됩니다.

닐이 맞습니다. 매크로입니다.

은 보통 다음과 같습니다

#ifdef INDSIDE_DLL 
    #define STATE_API __declspec(dllexport) 
#else 
    #define STATE_API __declsped(dllimport) 
#endif 

당신은 당신의 DLL에 INSIDE_DLL을 정의하고 STATE_API 매크로로 선언 된 모든 클래스를 내 보냅니다.

사용자는 중요하지 않습니다 클래스의로 :

+2

구문 상으로 typedef 일 수 없습니다. –

+0

'__declspec (novtable)'등을 포함 할 수 있습니다. –

+1

아마도 #define이라고 말할 수 있습니다. – xtofl

0

그것은 매크로이다.
컴파일러가 일부 작업을 수행하는 데 도움이되는 일부 플랫폼 관련 매크로입니다.

디자이너의 경우 클래스의 경우 특정 플랫폼이 필요하지 않으며 확장 된 의미와 확장 의미에 대한 연구를 이미 완료했습니다.

4

매크로입니다. 그것이 확장되는 것은 당신의 플랫폼에 달려 있습니다 - 그것은 표준 C++의 일부가 될 수 없습니다 (아무것도 확장하지 않는 한).

+0

그렇다면 Windows의 클래스 정의에 왜 그런가? 그것이 무엇을 의미합니까? –

2

이것은 DLL 프로젝트의 소스 코드입니까?

그렇다면 STATE_API는 선행 처리기 매크로 여야하며이 클래스가 선언 된 헤더를 라이브러리 프로젝트와 라이브러리를 사용하는 응용 프로그램에서 사용할 수 있습니다. 라이브러리 프로젝트

  • 가 STATE_API이 라이브러리를 이용하여 (dllexport) 프로젝트
  • 를 __declspec 정의 될 것이다 STATE_API은 (같이 DllImport)는

이것은 일반적으로 달성된다 __declspec하도록 정의 될

#ifdef USRDLL 
#define STATE_API __declspec(dllexport) 
#else 
#define STATE_API __declspec(dllimport) 
#endif 

USRDLL이 DLL의 프로젝트 옵션에 정의되어 있습니다.