【问题标题】:where is the definition of the "struct PSI_thread" in MySQL source code?MySQL源代码中“struct PSI_thread”的定义在哪里?
【发布时间】:2016-11-03 06:35:04
【问题描述】:

在研究MySQL 源代码时,我发现了一些没有任何定义的奇怪结构。比如mysql-server-code\include\mysql\psi\psi.h中的struct PSI_thread。但是我知道源代码文件中一定有定义,否则无法编译。有谁知道结构的真正定义在哪里?

结构体PSI_thread的定义

【问题讨论】:

    标签: c++ mysql c struct


    【解决方案1】:

    这是一个不透明的结构

    对于,不透明类型是一种内容未知的结构; 通常 opaques 类型完全按照您的代码显示在标题中声明:

    struct PSI_thread;
    typedef struct PSI_thread   PSI_thread;
    

    包含头部的代码会有一些限制:

    • 您不知道对象的大小。
    • 您不能直接声明具有该类型的对象,但只能处理指针,这也意味着您不能取消引用它们或分配新对象。

    库(在您的情况下为)提供了访问和处理类型本身的函数,包括分配和释放。 这些函数不能简单地是内联函数,因为它们需要访问类型的内容才能工作。

    不透明类型很有用,当您需要导出库的接口时:因为您不知道不透明类型的大小或内部顺序,所以库可以更改 opaque 类型而不更改 ABI,因此需要使用它重建软件。

    您可以将其视为库的私有上下文,库使用它来安全地完成其工作。


    编辑

    如果您无法在整个源代码中找到前向声明,您可以将其视为void *。一个空的结构。

    最大的区别在于空结构与其他可能的类型相比是不同的类型,编译器可能会抱怨类型不匹配。

    【讨论】:

    • 感谢您的回复,我知道C中的不透明类型。但我很困惑,即使我在整个源代码项目中查找结构,我仍然找不到它。我认为结构的真正定义必须在源代码文件(.h文件,.cc文件或.cpp文件)中的某个地方,不是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-09
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多