在C ++中查看库的源代码时,我经常会看到如下内容:
#define API_MACRO
class API_MACRO className
{
//Class stuff
};
此外,我通过方法签名看到以下内容:
void API_MACRO functionName();
所以我的问题是这是什么,这种做法叫做什么?我尝试在线查找,但一无所获。它似乎没有提供任何好处或实际用途......特别是因为这些函数和类已经包含在命名空间内。
答案 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。