[英]Explanation of Linux Kernel FIELD_SIZEOF macro
我正在学习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)
如何成为指针? 宏如何工作?
这里的关键是sizeof
是由编译器在编译时计算的。 因此,您指定的指针实际上不会被取消引用。 毕竟,对象所在的位置不会改变其大小。 sizeof
运算符将仅根据类型来评估其操作数。
因此,您使用的地址实际上是无关紧要的,但是0
( NULL
)是常见的选择。
sizeof(((t*)0)->f)
之所以起作用,是因为sizeof
被定义为不评估其参数(涉及VLA时有一些例外)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.