在功能
中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
答案 0 :(得分:4)
sqlite3
不是假结构; sqlite.h
文件只是没有定义它的主体。
其定义位于sqliteInt.h
文件中(也是sqlite3.c
合并的一部分):
/*
** Each database connection is an instance of the following structure.
*/
struct sqlite3 {
sqlite3_vfs *pVfs; /* OS Interface */
struct Vdbe *pVdbe; /* List of active virtual machines */
CollSeq *pDfltColl; /* The default collating sequence (BINARY) */
...
u8 mallocFailed; /* True if we have seen a malloc failure */
...