我想了解一些C++代码,具有以下类语法:当类声明看起来有两个名字时,这意味着什么?
class Q_MONKEY_EXPORT BasePlugin : public QObject
{
// some code comes here
};
我无法理解语法class Q_MONKEY_EXPORT BasePlugin
。对我来说,看起来像是这个班有两个名字。这种语法在C++中究竟意味着什么?
我想了解一些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
};
编辑:
正如大卫·赫弗南指出,像这样的宏通常用来让编译器知道它是否需要导入或导出符号。在构建模块时,通常将外部模块定义为dllimport
,将外部模块定义为dllexport
。我怀疑是这种情况,因为名称暗示了导出,但最好检查文档或实际转到定义。
Q_MONKEY_EXPORT
是一个宏(全部大写是宏观约定)通常解析为像__declspec(dllexport)
当你正在构建的DLL,当你正在使用的DLL解析为__declspec(dllimport)
。
你可以通过阅读你的包含文件来找到它到底是什么。
重复(某种程度上)http://stackoverflow.com/questions/3148571/strange-class-declaration? –
@LokiAstari为什么很难指定哪些符号要导出,哪些不能导出? –
@Omri Barel谢谢你指点我的问题,我的搜索没有成功,这就是为什么我问。 – Amani