类定义和函数签名中的宏有什么用

What are macros in class definitions and function signatures for?

本文关键字:什么 定义 函数      更新时间:2023-10-16

在查看C++库中的源代码时,我经常看到这样的事情:

#define API_MACRO
class API_MACRO className
{
    //Class stuff
};

此外,我还看到方法签名如下:

void API_MACRO functionName();

所以我的问题是这是为了什么,这种做法叫什么?我试着在网上查找,但一无所获。它似乎没有任何好处或实际用途......特别是因为这些函数和类已经包装在命名空间中。

如何让你的函数或类在Unix共享库或Windows DLL中公开使用?

每个人都有自己的方法。幸运的是,它们足够相似,宏可以处理它。

对于您想要的
海湾合作委员会 #define DLLEXPORT __attribute__((visibility("default")))

对于您想要的
Windows MSVC #define DLLEXPORT __declspec( dllexport )

如果您要链接到Windows中的DLL,则需要标记
定义 #define DLLEXPORT __declspec( dllimport )

上面的这些行是从我的一个项目中复制的,API_MACRO可能是一个更好的名称,因为导入时DLLEXPORT没有多大意义。

API_MACRO是有条件定义的。通常,在这种用法中,它被定义为__declspec(dllimport)__declspec(dllexport),或者当出于任何原因不使用MSVC的动态链接语言扩展时,什么都没有。

因此,该定义通常会在生成系统中找到,该系统确定它是在 Windows 下构建为使用还是生成 DLL。

相关文章: