2012-04-18 68 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中导出还是在另一侧导入。