4

我正在学习 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,和and替换了它-1它总是有效的。+999'a'"hello"

源中没有评论。我知道这->是用来通过指针访问结构成员的,但是指针怎么可能((struct book*)0)呢?宏是如何工作的?

4

2 回答 2

6

这里的关键是sizeof编译器在编译时计算的。因此,您指定的指针实际上从未被取消引用。毕竟,对象所在的位置不会改变其大小。运算符将sizeof纯粹根据类型评估其操作数。

因此,您使用的地址实际上是无关紧要的,但0( NULL) 是常见的选择。

于 2013-10-17T19:05:44.773 回答
2
sizeof(((t*)0)->f)

有效,因为sizeof被定义为不评估其参数(涉及 VLA 时有一些例外)。

于 2013-10-17T19:04:44.863 回答