一个奇怪的C++类声明

A strange C++ class declaration

本文关键字:C++ 声明 一个      更新时间:2023-10-16

在stackoverflow中阅读了这个线程:奇怪的类声明,但仍然与以下代码混淆 foo.h

class Foo CHECKLEAKDCL {

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

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

我也对 奇怪的类声明 的答案感到困惑,它说:

Q_CORE_EXPORT不是标识符。它是一个依赖于平台的宏, 它用于表示一个旨在用于 库边界。

谁能对此再做一些解释?


更新:

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

#define CHECKLEAKDCL  : private CheckLeak

所以类声明应该是:

class Foo : private CheckLeak {

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

如果您针对 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)

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

编辑

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

#define CHECKLEAKDCL  : private CheckLeak

在类声明中添加一个:,以便不能再使用该符号从基类继承。

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

我们无法确切地说出它是什么,因为我们掌握的信息比你还要少。

通常,我已经看到这样的宏决心为库导出宏。

也就是说,它的值应该定义为 dllexportdllimportextern(取决于平台)。但是,在这种情况下,宏将显示在类名之前。

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

如果您有文档,请搜索一个基类,该基类跟踪或报告其地址到内存跟踪器关于构造和销毁。

然后,应使用类似于以下内容的宏定义编译代码库:

#define CHECKLEAKDCL() : private MemoryTrackingBaseClass

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

如果只想编译,请尝试使用:

#define CHECKLEAKDCL()

编辑(解决您的更新)

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

仅当您想检查应用程序是否存在泄漏时,使用任何CheckLeak实现。

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

正如您所发现的,CHECKLEAKDCL是一个扩展到三个标记: private CheckLeak的宏。据推测CheckLeak是一个类,它向继承自它的类添加了一些泄漏检查诊断行为。

一般来说,这种混淆不是很有帮助。根据 CheckLeak 的属性,此宏可能会产生意想不到的副作用,例如将看似标准布局类的内容转换为非标准布局类。

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

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