2016-04-25 97 views
1

读过这个线程计算器:Strange class declaration ,但仍与下面的代码混淆在foo.h一个奇怪的C++类的声明

class Foo CHECKLEAKDCL { 

我相信,富应该是类名,因为有构造函数和解构者可以暗示这一点。

我在这个.h文件中看不到与CHECKLEAKDCL相关的任何宏定义。

也是我感到困惑的答案为Strange class declaration,其中说:

Q_CORE_EXPORT不是标识符。它是一个与平台相关的宏,它用于指示一个旨在跨越 库边界使用的类。

任何人都可以对此有更多的解释吗?


UPDATE:发现这条线在.h文件中,它包括在foo.h

#define CHECKLEAKDCL : private CheckLeak 

所以类信息声明应该是:

class Foo : private CheckLeak { 

所以Foo是extend ing CheckLeak,对吗?

+2

搜索'CHECKLEAKDCL'的整个项目,必须将其定义为某处的预处理器宏。 –

+1

看看这个:http://stackoverflow.com/questions/7840874/what-does-it-mean-when-a-class-declaration-appears-to-have-two-names我希望它可以帮助你= D – Nestoraj

+0

无论是那个还是'​​Foo'都被定义为一个扩展为空的预处理器宏,或者更糟糕的是扩展为'{}; class'。 –

回答

1

如果你为Windows编译(使用Visual Studio),极有可能会进行评估,以Microsoft专用链接标识符之一,dllexportdllimport

https://msdn.microsoft.com/en-us/library/81h27t8c.aspx

在创建它是用来类将从DLL中导出或从应用程序中的DLL中使用,并且依赖于它的评估结果为dllexport(导出类的DLL)或dllimport(导入类的应用程序)。

如果使用GCC进行编译,可能会评估为gcc _-attribute__之一。如__attribute__ ((visibility ("default")))https://gcc.gnu.org/wiki/Visibility

这些扩展核心下用编译器提供++做某些任务更容易实现(https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Extensions.html

编辑

你答案更新后好... ,显然你有一个类的私人继承。但请注意,这是一个可怕的宏你有没有因为

#define CHECKLEAKDCL : private CheckLeak 

在类的声明增加了一个:所以你不能使用该符号再从基类继承。

我建议你得到完全消除,宏观的,如果你不能,不要使用它,它会混淆你的代码。

+0

刚开始学习C++。有了这个宏,我将无法使用':'来继承任何类? – ZhaoGang

1

我们无法确切知道它是什么,因为我们的信息甚至比您少。

通常情况下,我看到这样的宏决心导出宏,为图书馆。

也就是说,它的值应该定义为dllexport,dllimportextern(取决于平台)。 尽管如此,该宏出现在类名前面。

考虑到宏观类名后出现,它只能解析到一个基类,或基类的列表,或空宏。

如果你的文档,搜索跟踪或报告它的地址来建设和破坏的内存跟踪器的基类。

然后,代码库应该使用类似于此一宏定义被编译:

#define CHECKLEAKDCL() : private MemoryTrackingBaseClass 

(其中MemoryTrackingBaseClass是我上面提到的类 - 根据你的编辑,CheckLeak)。

如果你想简单地编译,请尝试使用:

#define CHECKLEAKDCL() 

编辑(解决您的更新)

所以美孚正在扩大CheckLeak,对不对?

只有当你想检查你的应用程序的泄漏,使用任何CheckLeak实现。

在生产环境中(在使用继承自CheckLeak的定义之后),您应该将CHECKLEAKDCL定义为空宏(用于速度)。

0

正如你已经发现,CHECKLEAKDCL是扩展到三个令牌: private CheckLeak宏。据推测CheckLeak是一个类,它添加了一些泄漏检查诊断行为,从它继承的类。

一般情况下,这种混淆是不是非常有帮助。根据CheckLeak的属性,该宏可能具有意想不到的副作用,例如将看起来像标准布局类的东西变成非标准布局类。

这也将是很难添加CHECKLEAKDCL到想从另一个类继承任何其他原因的类。 (你应该class Foo CHECKLEAKDCL, public OtherBase?)

就个人而言,如果有机会改善这个项目,我希望在这种情况下用它的实际扩展替换这个宏。