2012-04-18 3 views
1

Я использую библиотеку QuickFAST, и, проверяя ее, я нашел это объявление класса, которое, похоже, я действительно не получаю! Я имею в виду, что имя макроса перед именем класса!Объявление метода С ++, включающее макрос

class QuickFAST_Export Message : public FieldSet 

также я нашел это заявление

friend void QuickFAST_Export intrusive_ptr_add_ref(const Field * ptr); 

и снова я не получаю использование этой декларации!

для получения дополнительной информации вот QuickFAST_Export.hpp

#ifdef _MSC_VER 
# pragma once 
#endif 
#ifndef QUICKFAST_EXPORT_H 
#define QUICKFAST_EXPORT_H 

// Compile time controls for library generation. Define with /D or #define 
// To produce or use a static library: #define QUICKFAST_HAS_DLL=0 
// Default is to produce/use a DLL 
// While building the QUICKFAST_ library: #define QUICKFAST_BUILD_DLL 
// Default is to export symbols from a pre-built QUICKFAST DLL 
// 
// Within QUICKFAST use the QuickFAST_Export macro where a __declspec is needed. 

#if defined (_WIN32) 

# if !defined (QUICKFAST_HAS_DLL) 
# define QUICKFAST_HAS_DLL 1 
# endif /* ! QUICKFAST_HAS_DLL */ 

# if defined (QUICKFAST_HAS_DLL) && (QUICKFAST_HAS_DLL == 1) 
# if defined (QUICKFAST_BUILD_DLL) 
#  define QuickFAST_Export __declspec(dllexport) 
# else /* QUICKFAST_BUILD_DLL */ 
#  define QuickFAST_Export __declspec(dllimport) 
# endif /* QUICKFAST_BUILD_DLL */ 
# else /* QUICKFAST_HAS_DLL == 1 */ 
# define QuickFAST_Export 
# endif /* QUICKFAST_HAS_DLL == 1 */ 

# else /* !_WIN32 */ 
+0

Вы должны искать, например. '__declspec (dllexport)' или '__declspec (dllimport)', чтобы узнать, что они означают. –

ответ

2

Это означает, что класс либо экспортируется или импортируется, в зависимости от которого построен модуль.

Если QUICKFAST_HAS_DLL определено и равно 1, это означает, что модуль построен как DLL. Чтобы использовать функциональные возможности извне, нужно экспортировать классы и методы.

Внутри модуля указан QUICKFAST_BUILD_DLL. Поэтому, когда вы создаете модуль, QuickFAST_Export расширяется до __declspec(dllexport). Ваше определение класса становится:

class __declspec(dllexport) Message : public FieldSet 

Когда вы включаете заголовок из другого модуля, QUICKFAST_BUILD_DLL не определен, поэтому макрос расширяется до __declspec(dllimport), и вашего определения класса:

class __declspec(dllimport) Message : public FieldSet 
+0

ok Я получил это сейчас, но поставил __declspec (dllimport) перед className, что должен делать с телом моего класса, я имею в виду, что я до сих пор не получаю это объявление, я знаю, что для уничтожения класса все, что нам нужно do «class className: public ClassBase», так что это за новая декларация? – Glolita

+0

@Glolita вы пробовали использовать синтаксис? Он сообщает компоновщику, что класс должен быть экспортирован. –

+0

@Glolita У меня точно такой же вопрос. Люди, похоже, не удовлетворительно отвечают на мой (наш) вопрос. Я предполагаю, что мой реальный вопрос заключается в том, что конкретно означает '__declspec (dllimport)' точно, и как это легальный синтаксис в C++ помещает его в середину объявления класса? Поэтому я боюсь, комментарий @ LuchianGrigore не помогает вообще. – Ray

2

макроса подставляет либо __declspec(dllimport), либо __declspec(dllexport), в зависимости от того, был ли класс экспортирован из DLL или импортирован с другой стороны.