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



我从来没有在宏中遇到过...。这个宏应该做什么?它计算从类型开头到成员字段末尾的偏移量,然后计算从类型开头到成员字段末尾的偏移量。但是这两个值是如何结合在一起的呢?

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

它不计算任何东西。它用于 GCC 的大小写范围扩展,以便您可以编写:

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 扩展的更多文档:

  • https://gcc.gnu.org/onlinedocs/gcc/Case-Ranges.html

最新更新