类定义和函数签名中的宏是什么?

时间:2016-02-09 22:25:25

标签: c++ api class macros signature

在C ++中查看库的源代码时,我经常会看到如下内容:

#define API_MACRO

class API_MACRO className
{
    //Class stuff
};

此外,我通过方法签名看到以下内容:

void API_MACRO functionName();

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

2 个答案:

答案 0 :(得分:2)

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

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

对于你想要的GCC #define DLLEXPORT __attribute__((visibility("default")))

对于Windows MSVC,你想要
#define DLLEXPORT __declspec( dllexport )

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

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

答案 1 :(得分:1)

API_MACRO是有条件定义的。通常在此用法中,它被定义为__declspec(dllimport)__declspec(dllexport),或者由于某种原因未使用MSVC的动态链接语言扩展时根本没有任何内容。

因此,定义通常可以在构建系统中找到,它确定它是在Windows下构建为消耗还是构建DLL。