1

在函数中

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

4

1 回答 1

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 */
  ...
于 2013-02-05T07:56:37.133 回答