类定义和函数签名中的宏有什么用
What are macros in class definitions and function signatures for?
在查看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。
相关文章:
- #定义c-预处理器常量..我做错了什么
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在C/C++中将变量名定义为__00000001有什么好处吗
- 在 ubuntu3 上C++ goto 定义有什么解决方案吗16.04?
- C++中"dependent name"的定义是什么?
- 什么是自定义比较器以及如何在 C++ 的排序函数中使用它?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 在模板类之外定义友元函数的正确方法是什么?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 自定义数据结构的优点是什么?
- [未定义提及'SetLastError@4']是什么意思?
- 在C++中,创建'n'数量的对象的推荐方法是什么,其中n是用户定义的。我该怎么做?
- 为了从自定义目录使用 CMake,我需要做什么?
- 此模板定义在 C++ 中是什么意思?
- 根据 c++ 标准在该宏定义中推送/弹出宏时的行为是什么
- 有什么方法可以在标头中定义和声明 extern 对象吗?
- 我可以在可移植库中使用什么定义来判断编译器是否Microsoft?