一个奇怪的C ++类声明

时间:2016-04-25 07:54:46

标签: c++

在stackoverflow中读过这个帖子:Strange class declaration ,但仍然与foo.h中的以下代码混淆:

class Foo CHECKLEAKDCL {

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

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

我也对Strange class declaration的答案感到困惑,该答案说:

  

Q_CORE_EXPORT不是标识符。它是一个依赖于平台的宏,   并且它曾用于表示打算使用的课程   图书馆边界。

任何人都可以对此进行更多解释吗?

更新

在.h文件中找到此行,该文件包含在foo.h

#define CHECKLEAKDCL  : private CheckLeak

所以课程的声明应该是:

class Foo : private CheckLeak {

所以Foo正在扩展CheckLeak,对吧?

3 个答案:

答案 0 :(得分:2)

如果您为Windows编译(使用Visual Studio),很可能会将其评估为Microsoft特定的一个链接标识符dllexportdllimport

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

当您创建一个将从DLL导出或从应用程序中的DLL使用的类时使用它,并且依赖于它,它被评估为dllexport(DLL导出类)或{{1 (导入类的应用程序)。

如果您使用GCC进行编译,它可能会评估为其中一个gcc dllimport。例如_-attribute__https://gcc.gnu.org/wiki/Visibility

核心C ++的这些扩展由编译器提供,以使某些任务更容易实现(https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Extensions.html

修改

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

__attribute__ ((visibility ("default")))

在类声明中添加#define CHECKLEAKDCL : private CheckLeak ,因此您不能再使用该符号继承基类。

我建议你完全摆脱那个宏,如果你不能,不要使用它,它会混淆你的代码。

答案 1 :(得分:1)

我们无法准确说出它是什么,因为我们的信息比你的信息少。

通常情况下,我已经看到这样的宏解析为库导出宏。

也就是说,它的值应定义为dllexportdllimportextern(取决于平台)。 但在这种情况下,宏会出现在班级名称之前。

考虑到宏出现在类名后面,它只能解析为基类,或基类列表,或者是空宏。

如果您有文档,请搜索一个基类,该基类在构造和销毁时跟踪或报告它的内存跟踪器。

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

#define CHECKLEAKDCL() : private MemoryTrackingBaseClass

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

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

#define CHECKLEAKDCL()

修改(解决您的更新)

  

所以Foo正在扩展CheckLeak,对吧?

仅当您要使用CheckLeak工具检查应用程序是否存在泄漏时。

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

答案 2 :(得分:0)

正如您所发现的那样,CHECKLEAKDCL是一个扩展为三个令牌: private CheckLeak的宏。据推测,CheckLeak是一个类,它将一些泄漏检查诊断行为添加到继承它的类中。

一般来说,这种混淆不是很有帮助。根据{{​​1}}的属性,此宏可能会出现意外的副作用,例如将看似标准布局类的内容转换为非标准布局类。

由于任何其他原因,将CheckLeak添加到想要从其他类继承的类也很困难。 (你应该CHECKLEAKDCL吗?)

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