一个奇怪的C++类声明
A strange C++ class declaration
在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特定链接标识符之一,dllexport
或dllimport
:
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
在类声明中添加一个:
,以便不能再使用该符号从基类继承。
我建议你完全摆脱那个宏,如果你不能,不要使用它,它会混淆你的代码。
我们无法确切地说出它是什么,因为我们掌握的信息比你还要少。
通常,我已经看到这样的宏决心为库导出宏。
也就是说,它的值应该定义为 dllexport
、 dllimport
或 extern
(取决于平台)。但是,在这种情况下,宏将显示在类名之前。
考虑到宏出现在类名之后,它只能解析为基类、基类列表或空宏。
如果您有文档,请搜索一个基类,该基类跟踪或报告其地址到内存跟踪器关于构造和销毁。
然后,应使用类似于以下内容的宏定义编译代码库:
#define CHECKLEAKDCL() : private MemoryTrackingBaseClass
(其中MemoryTrackingBaseClass
是我上面提到的类 - 根据您的编辑,CheckLeak
)。
如果只想编译,请尝试使用:
#define CHECKLEAKDCL()
编辑(解决您的更新)
所以Foo正在扩展CheckLeak,对吧?
仅当您想检查应用程序是否存在泄漏时,使用任何CheckLeak
实现。
在生产环境中(使用继承自 CheckLeak
的定义之后),您可能应该将CHECKLEAKDCL
定义为空宏(为了速度)。
正如您所发现的,CHECKLEAKDCL
是一个扩展到三个标记: private CheckLeak
的宏。据推测CheckLeak
是一个类,它向继承自它的类添加了一些泄漏检查诊断行为。
一般来说,这种混淆不是很有帮助。根据 CheckLeak
的属性,此宏可能会产生意想不到的副作用,例如将看似标准布局类的内容转换为非标准布局类。
也很难将CHECKLEAKDCL
添加到出于任何其他原因想要从另一个类继承的类中。(你应该class Foo CHECKLEAKDCL, public OtherBase
吗?
就个人而言,如果有机会改进这个项目,我倾向于在这种情况下用它的实际扩展来替换这个宏。
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- #ifdef和未声明的标识符
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- 在将变量声明为引用时,堆在释放后使用
- C++:无法访问声明的受保护成员
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 在函数内部的声明中初始化数组,并在外部使用它
- Visual Studio中的函数声明和函数定义问题
- c++类声明时,相同的例程,不同的成员变量类型
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别