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 在导入时没有多大意义。