2012-04-18 69 views
1

我正在使用QuickFAST庫,並檢查它時,我發現這個類聲明,我似乎並沒有真正得到!我的意思是什麼名稱之前的宏名稱!包含宏的C++方法聲明

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)'來了解它們的含義。 – 2012-04-18 13:34:02

回答

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

好吧我現在知道了,但是在className之前放置了__declspec(dllimport)對我的類的主體應該做什麼,我的意思是我還沒有得到這個聲明,我知道爲了解開一個類,我們需要do是「class className:public ClassBase」,那麼這個新的聲明是什麼? – Glolita 2012-04-18 14:06:12

+0

@Golita你試過用google搜索語法嗎?它告訴鏈接器該類將被導出。 – 2012-04-18 14:08:33

+0

@Glolita我有完全相同的問題。人們似乎沒有滿意地回答我的(我們)問題。我想我真正的問題是,究竟是什麼「__declspec(dllimport)」,以及C++中的合法語法如何將它放在類聲明的中間?所以我很害怕@ LuchianGrigore的評論根本沒有幫助。 – Ray 2015-12-04 15:44:26

2

的宏展開到__declspec(dllimport)__declspec(dllexport),這取決於類是從DLL中導出還是在另一側導入。