私はc99を学んでおり、構造について読んだ後、Linuxカーネルコードで次のマクロを見つけました:
#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
私..何?使用法:
#include <stdio.h>
#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
struct book {
char title[100];
char author[100];
};
int main(void)
{
printf("%lu\n", FIELD_SIZEOF(struct book, title)); // prints 100
}
これが展開です(gcc -E)
printf("%lu\n", (sizeof(((struct book*)0)->title)));
私を本当に困惑させるのは0
. 1
、2
、+1
、-1
、+999
および'a'
に置き換えましたが"hello"
、常に機能します。
ソースにコメントはありません。ポインターを介して構造体メンバーにアクセスするために使用されることは知ってい->
ますが、どのよう((struct book*)0)
にポインターになることができますか? マクロはどのように機能しますか?