" struct PSI_thread"的定义在哪里?在MySQL源代码?

时间:2016-11-03 06:35:04

标签: c++ mysql c struct

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

struct PSI_thread的定义

enter image description here

1 个答案:

答案 0 :(得分:0)

这是一个不透明的结构

对于,opaque类型是一个内容未知的结构; 通常,opaques类型的声明与代码显示的一样,在标题中:

struct PSI_thread;
typedef struct PSI_thread   PSI_thread;

包含标题的代码会有一些限制:

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

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

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

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

修改

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

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