在sqlite3源代码中混淆sqlite3结构

时间:2013-02-05 06:15:50

标签: c database sqlite

在功能

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

在哪里?

1 个答案:

答案 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 */
  ...