Почему определения классов C ++ в Windows часто имеют макро-токен после 'class'? - PullRequest
1 голос
/ 08 декабря 2009

Я пытаюсь понять проект с открытым исходным кодом, где я наткнулся на следующее объявление класса:

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; };
};

Что означает STATE_API перед именем класса AttributeSubject? Это какой-то макрос?

Ответы [ 4 ]

9 голосов
/ 08 декабря 2009

Это, вероятно, typedef для __declspec (dllimport) или __declspec (dllexport) и используется внутри DLL на платформе Windows для экспорта классов.

Нил прав, это макрос.

Обычно это выглядит так:

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

Вы определяете INSIDE_DLL только в своей dll и экспортируете все классы, объявленные с помощью макроса STATE_API.

4 голосов
/ 08 декабря 2009

Это макрос. То, что он расширяет, зависит от вашей платформы - он не может быть частью стандарта C ++ (если он не расширяется до нуля).

2 голосов
/ 08 декабря 2009

Это исходный код проекта DLL?

Если это так, то STATE_API должен быть макросом препроцессора, позволяющим использовать заголовок, в котором этот класс объявлен как в проекте библиотеки, так и в приложении, использующем библиотеку.

  • в проекте библиотеки STATE_API будет определен как __declspec (dllexport)
  • в проекте с использованием библиотеки STATE_API будет определено как __declspec (dllimport)

Обычно это достигается примерно так:

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

USRDLL определяется в параметрах проекта библиотеки DLL.

0 голосов
/ 08 декабря 2009

Это макрос:

Как пользователь класса, это не так важно.
Это некоторый макрос для конкретной платформы, который используется (вероятно), чтобы помочь компилятору выполнить некоторую операцию.

Как разработчик класса, вы пытаетесь сделать что-то платформенное для этого класса, и вы уже провели исследование того, во что он распространяется и что означает это расширение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...