当一个类声明看起来有两个名字时,这意味着什么?

时间:2011-10-20 19:03:07

标签: c++

我正在尝试理解一些具有以下类语法的C ++代码:

class Q_MONKEY_EXPORT BasePlugin : public QObject
{
    // some code comes here
};

我无法理解语法class Q_MONKEY_EXPORT BasePlugin。对我来说,看起来这个班级有两个名字。这种语法究竟在C ++中意味着什么?

3 个答案:

答案 0 :(得分:6)

Q_MONKEY_EXPORT很可能是某个地方的#define。定义有时需要的,例如当类在库中时,需要在从其他地方包含头文件时导出。在这种情况下,定义解析为__declspec(dllexport)(确切的语法将取决于您使用的工具)。

答案 1 :(得分:6)

这很可能是一个预处理程序指令,告诉编译器要导出符号。

它可能被定义为:

#define Q_MONKEY_EXPORT _declspec(dllexport)

这会导致您的课程导出到dll

完整的声明将在编译之前扩展为:

class _declspec(dllimport) BasePlugin : public QObject
{
    // some code comes here
};

编辑:

正如David Heffernan指出的那样,这些宏通常用于让编译器知道它是否需要导入或导出符号。通常在构建模块时将外部模块定义为dllimport,将dllexport定义为{{1}}。我怀疑是这种情况,因为名称建议导出,但最好检查文档或实际上去定义。

答案 2 :(得分:2)

Q_MONKEY_EXPORT是一个宏(所有大写都是宏的约定),在构建DLL时通常会解析为__declspec(dllexport),并在使用时解析为__declspec(dllimport) DLL。

通过阅读包含文件,您可以准确了解它是什么。