当一个类声明似乎有两个名称时,这意味着什么?

What does it mean when a class declaration appears to have two names?

本文关键字:什么 两个 意味着 一个 声明      更新时间:2023-10-16

我试图理解一些c++代码,其中有以下类语法:

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

我无法理解语法class Q_MONKEY_EXPORT BasePlugin。在我看来,这个类好像有两个名字。这种语法在c++中究竟意味着什么?

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

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

它可能被定义为:

#define Q_MONKEY_EXPORT _declspec(dllexport)

,这将导致您的类被导出到dll

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

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

正如David Heffernan所指出的,像这样的宏通常用于让编译器知道它是否需要导入或导出符号。通常在外部模块定义为dllimport,在构建模块时定义为dllexport。我怀疑这里的情况是这样的,因为名称暗示导出,但最好检查文档或实际到定义。

Q_MONKEY_EXPORT是一个宏(所有大写是宏的惯例),通常在构建DLL时解析为__declspec(dllexport),在使用DLL时解析为__declspec(dllimport)