gpt4 book ai didi

无法在 sqlite 中找到实际结构

转载 作者:太空宇宙 更新时间:2023-11-04 03:51:02 25 4
gpt4 key购买 nike

我正在 sqlite 3 源代码中搜索“struct sqlite3_stmt”的完整定义,但无法在任何地方找到它。我很难过!

我唯一发现的是:typedef struct sqlite3_stmt sqlite3_stmt;

这是什么 C 魔法?

最佳答案

此链接:Never defined structure解决了 SQLite3 中的特定实现,是一本有趣的读物。

我只是从C语言的角度来描述这里发生的事情。

如果你写:

struct sqlite3_stmt;

你告诉编译器有一个名为 sqlite3_stmt 的结构存在于你的翻译单元或另一个库中的某处。如果存在匹配定义,该符号将在链接时解析。

请注意,编译器不知道它的大小,因此它只能作为指针访问,如下所示:

struct sqlite3_stmt * ptr_totstmt; /* OK */

然而这会给你一个错误:

struct sqlite3_stmt stmt; /* error: storage size of 'stmt' isn't known */

此外,必须在指针声明前加上关键字struct,否则编译器无法解析符号:

sqlite3_stmt * ptr_totstmt; /* error: unknown type name 'sqlite3_stmt' */

这里 typedef 的目的是添加语法糖,这样类型的用户就不必关心他是否正在使用结构。

typedef struct sqlite3_stmt sqlite3_stmt;

sqlite3_stmt * ptr_totstmt; /* OK */

实际上,对于编译器而言,struct sqlite3_stmtsqlite3_stmt 是两个不同的东西,后者方便地作为前者的别名。

这里的“神奇”之处在于,只要struct sqlite3_stmt 类型或其别名仅用于实例化指针,就永远不需要知道其大小,只需知道目标系统。实际上,链接器甚至懒得尝试解析它们,因为指针不过是表示内存中地址的值。

所以在这里,struct sqlite3_stmt 从未在 SQLite3 代码中的任何地方实现,它实际上只是作为指针访问并转换为实现期望的任何“真实”类型。

关于无法在 sqlite 中找到实际结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20477065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com