MySQL源代码中“struct PSI_thread”的定义在哪里?

Posted

技术标签:

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

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

结构体PSI_thread的定义

【问题讨论】:

【参考方案1】:

这是一个不透明的结构

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

struct PSI_thread;
typedef struct PSI_thread   PSI_thread;

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

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

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

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

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


编辑

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

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

【讨论】:

感谢您的回复,我知道C中的不透明类型。但我很困惑,即使我在整个源代码项目中查找结构,我仍然找不到它。我认为结构的真正定义必须在源代码文件(.h文件,.cc文件或.cpp文件)中的某个地方,不是吗?

以上是关于MySQL源代码中“struct PSI_thread”的定义在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 MySQL 代码放入源代码管理中?

MySQL源代码中“struct PSI_thread”的定义在哪里?

在源代码管理中存储 MySQL 数据库的最佳方式是啥?

MySQL 错误代码:在 MySQL Workbench 中更新期间出现 1175

win10无法启动mysql服务 错误代码1067

MySql.Data.dll 中出现“MySql.Data.MySqlClient.MySqlException”类型的异常,但未在用户代码中处理