I'm learning c99 and after reading about structures I found the following macro in the Linux Kernel code:
#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
I.. what? Usage:
#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
}
Here's the expansion (gcc -E)
printf("%lu\n", (sizeof(((struct book*)0)->title)));
What really baffles me is the 0
. I replaced it with 1
, 2
, +1
, -1
, +999
and 'a'
and "hello"
, and it always works.
There's no comment in the source. I know that ->
is used to access a struct member through a pointer, but how can ((struct book*)0)
be a pointer? How does the macro work?