関数では
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
?