在研究MySQL
源代码时,我发现了一些没有任何定义的奇怪结构。例如PSI_thread
中的结构mysql-server-code\include\mysql\psi\psi.h
。但我知道源代码文件中某处必须有一个定义,否则就无法编译。有没有人知道结构的真正定义在哪里?
struct PSI_thread的定义
答案 0 :(得分:0)
这是一个不透明的结构
对于c,opaque类型是一个内容未知的结构; 通常,opaques类型的声明与代码显示的一样,在标题中:
struct PSI_thread;
typedef struct PSI_thread PSI_thread;
包含标题的代码会有一些限制:
库(在您的情况下为mysql)提供访问和处理类型本身的函数,包括分配和释放。 这些函数不能简单地是内联函数,因为它们需要访问要使用的类型的内容。
当您需要导出库的界面时, 非常有用:因为您不知道opaque类型的大小或内部顺序,所以库可以更改opaque类型而不更改ABI ,因此需要使用它重建软件。
您可以将其视为库的私有上下文,由库使用以安全地完成其工作。
修改强>
如果您无法在整个源代码中找到转发声明,可以将其视为void *
。一个空结构。
最大的区别在于,与其他可能的类型相比,它是一个不同类型的空结构,编译器可能会抱怨类型不匹配。