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