在函数中
static int sqlite3Prepare(
sqlite3 *db, /* Database handle. */
const char *zSql, /* UTF-8 encoded SQL statement. */
int nBytes, /* Length of zSql in bytes. */
int saveSqlFlag, /* True to copy SQL text into the sqlite3_stmt */
Vdbe *pReprepare, /* VM being reprepared */
sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */
const char **pzTail /* OUT: End of parsed string */
) {
...
pParse = sqlite3StackAllocZero(db, sizeof(*pParse));
...
assert( !db->mallocFailed );
...
}
我知道 sqlite3 只是一个声明为的假结构
typedef struct sqlite3 sqlite3;
没有任何身体。我知道sqlite3 *
通常是强制转换为Vdbe*
.
但在这里,db
属于 的类型sqlite3*
,怎么可能db->malloFailed
存在呢?为什么编译器不抱怨?
有类似的情况sqlite3_stmt
:
typedef struct sqlite3_stmt sqlite3_stmt;
没有身体。我猜sqlite3_stmt
是解析后的 SQL 语句的语法树。我想看看它的结构。但是,使用这种奇怪的模式将类型隐藏得如此之深,以至于我看不到它是什么。
甚至Vdbe
是同样的情况……
typedef struct Vdbe Vdbe;
到底哪里是真实的struct
?