繁体   English   中英

Linux内核FIELD_SIZEOF宏的说明

[英]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 我用它代替12+1-1+999'a'"hello"它总是有效

在源中没有评论。 我知道->用于通过指针访问结构成员,但是((struct book*)0)如何成为指针? 宏如何工作?

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

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

sizeof(((t*)0)->f)

之所以起作用,是因为sizeof被定义为不评估其参数(涉及VLA时有一些例外)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM