私は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)にポインターになることができますか? マクロはどのように機能しますか?