class 定义和函数签名中的宏有什么用?
What are macros in class definitions and function signatures for?
在查看 C++ 库的源代码时,我经常看到这样的事情:
#define API_MACRO
class API_MACRO className
{
//Class stuff
};
此外,我还看到了以下带有方法签名的内容:
void API_MACRO functionName();
所以我的问题是这是做什么用的,这种做法叫什么?我尝试在网上查找它,但一无所获。它似乎没有提供任何好处或实际用途......特别是因为这些功能和 类 已经包含在名称空间中。
API_MACRO是有条件定义的。通常在这种用法中,它被定义为 __declspec(dllimport)
或 __declspec(dllexport)
,或者在出于任何原因不使用 MSVC 的动态链接语言扩展时根本没有。
因此,定义通常会在构建系统中找到,它决定了它是在 Windows 下构建为消耗还是构建 DLL。
如何使您的函数或 class 显示为 public 在 Unix 共享库或 Windows DLL 中使用?
各有各的方法。幸运的是,它们非常相似,一个宏就可以处理它。
你想要的 GCC
#define DLLEXPORT __attribute__((visibility("default")))
对于 Windows 你想要的 MSVC
#define DLLEXPORT __declspec( dllexport )
如果您链接到 Windows 中的 DLL,则需要标记定义
#define DLLEXPORT __declspec( dllimport )
上面的那些行是从我的一个项目中复制的,API_MACRO
可能是一个更好的名字,因为 DLLEXPORT
在导入时没有多大意义。
在查看 C++ 库的源代码时,我经常看到这样的事情:
#define API_MACRO
class API_MACRO className
{
//Class stuff
};
此外,我还看到了以下带有方法签名的内容:
void API_MACRO functionName();
所以我的问题是这是做什么用的,这种做法叫什么?我尝试在网上查找它,但一无所获。它似乎没有提供任何好处或实际用途......特别是因为这些功能和 类 已经包含在名称空间中。
API_MACRO是有条件定义的。通常在这种用法中,它被定义为 __declspec(dllimport)
或 __declspec(dllexport)
,或者在出于任何原因不使用 MSVC 的动态链接语言扩展时根本没有。
因此,定义通常会在构建系统中找到,它决定了它是在 Windows 下构建为消耗还是构建 DLL。
如何使您的函数或 class 显示为 public 在 Unix 共享库或 Windows DLL 中使用?
各有各的方法。幸运的是,它们非常相似,一个宏就可以处理它。
你想要的 GCC
#define DLLEXPORT __attribute__((visibility("default")))
对于 Windows 你想要的 MSVC
#define DLLEXPORT __declspec( dllexport )
如果您链接到 Windows 中的 DLL,则需要标记定义
#define DLLEXPORT __declspec( dllimport )
上面的那些行是从我的一个项目中复制的,API_MACRO
可能是一个更好的名字,因为 DLLEXPORT
在导入时没有多大意义。