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 に答える