sds 関数の使用方法を学習しようとしています。プロジェクト フォルダーにコード sds.h および sds.c コード ファイルがあり、私が作成した小さな探索プログラムはコンパイルして正常に実行されます。しかし、sds.h および sds.c ファイルのコードに表示されている内容を理解するのに苦労しています。なぜそれが動作するどころか、コンパイルできるのかわかりません。
問題のコードは次のとおりです。
typedef char *sds;
struct sdshdr {
int len;
int free;
char buf[];
};
static inline size_t sdslen(const sds s) {
struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
return sh->len;
}
sdslen() 関数は sds.c ファイルで何度も呼び出されており、sds.h をインクルードした後で自分のプログラムで使用することもできます。typedef が sds を単なる char ポインターの型にすることを知っています。static キーワードは、関数の範囲を制限します。インラインとは、スタックおよび関数呼び出しメカニズムを使用するのではなく、関数が呼び出されたときにコンパイラによって関数がコードに貼り付けられることを意味します。sdslen() 関数の *sh ポインターには、s に格納されたアドレスの前に sizeof(struct sdshdr) メモリ アドレスが割り当てられ、構造体の変数を初期化せずに len メンバー変数が返されるように見えます。 . これ、実際に何が起こっているのかを理解するための助けをいただければ幸いです。