阅读PCL源码时,发现
#if defined WIN32 || defined _WIN32 || defined WINCE || defined __MINGW32__
#ifdef PCLAPI_EXPORTS
#define PCL_EXPORTS __declspec(dllexport)
#else #define PCL_EXPORTS
#endif
#else
#define
PCL_EXPORTS
#endif
在C++中,class
前面的宏定义(例如PCL_EXPORTS
)并不是类的返回类型,而是用于修饰符号的导出属性。这在Windows平台上尤为重要,因为它控制了哪些符号可以从动态链接库(DLL)中被外部访问。
宏定义的作用
PCL_EXPORTS
是一个宏定义,用来修饰类或函数,以便在编译时控制它们的导出属性。具体来说,这个宏定义会在不同的编译环境下展开成不同的内容,以控制符号是否被导出或导入。
#ifdef PCLAPI_EXPORTS
#define PCL_EXPORTS __declspec(dllexport)
#else
#define PCL_EXPORTS __declspec(dllimport)
#endif
class PCL_EXPORTS MyClass {
public:
void myFunction();
};
解释
-
宏定义和展开
#ifdef PCLAPI_EXPORTS
: 检查是否定义了PCLAPI_EXPORTS
宏。#define PCL_EXPORTS __declspec(dllexport)
: 如果定义了PCLAPI_EXPORTS
,那么PCL_EXPORTS
被定义为__declspec(dllexport)
,用于导出符号。#else
和#define PCL_EXPORTS __declspec(dllimport)
: 如果没有定义PCLAPI_EXPORTS
,那么PCL_EXPORTS
被定义为__declspec(dllimport)
,用于导入符号。
-
类定义
class PCL_EXPORTS MyClass
: 这里的PCL_EXPORTS
宏会在预处理阶段被展开成__declspec(dllexport)
或__declspec(dllimport)
。- 导出时(当
PCLAPI_EXPORTS
被定义):class __declspec(dllexport) MyClass
,这会告诉编译器将MyClass
类导出,使其可以被其他模块使用。 - 导入时(当
PCLAPI_EXPORTS
没有定义):class __declspec(dllimport) MyClass
,这会告诉编译器从DLL中导入MyClass
类。
总结
PCL_EXPORTS
宏并不是类的返回类型,而是一个修饰符,用于控制符号的导出和导入。在编译DLL时,它会展开成 __declspec(dllexport)
,从而导出符号;而在使用DLL时,它会展开成 __declspec(dllimport)
,从而导入符号。这种机制使得代码可以跨多个项目和编译环境使用,而无需手动修改符号导出和导入的细节。