这个 C 宏主体中的三重点是如何工作的?

How do triple dots in this C macro body work?

我从未在宏中见过 ...。这个宏应该做什么?它计算成员从类型开始的偏移量,然后它计算从类型开始到成员字段末尾的偏移量。但是这两个值是如何组合的呢?

#define bpf_ctx_range(TYPE, MEMBER)                     \
offsetof(TYPE, MEMBER) ... offsetofend(TYPE, MEMBER) - 1

它不计算任何东西。它用于 GCC 的 case-range 扩展,因此您可以这样写:

switch (byte_offset) {
case bpf_ctx_range(foo_struct, bar_member):
     // do something...
     break;
}

找出 offset 处的字节属于哪个成员。

它旨在用于 case 语句(它使用 GNU C 扩展,这在 Linux 内核中很常见)。

例如:

switch(bpf_var_value)
{
    case bpf_ctx_range(struct bpf_stuff, bpf_member):
        /* do stuff */;
        break;
}

它实际上并没有计算任何东西,它只是一种更快、更简单的编写 case 标签的方法,因此您不必写出您想要捕获的每个单独的值。

然而,在这种情况下,它实际上被用来做一些在严格符合 C 中不可能完成的事情,即根据编译时常量的值编写多个 case 标签。

以下是 GCC 的 GNU C 扩展的更多文档: