这个 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 扩展的更多文档:
我从未在宏中见过 ...
。这个宏应该做什么?它计算成员从类型开始的偏移量,然后它计算从类型开始到成员字段末尾的偏移量。但是这两个值是如何组合的呢?
#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 扩展的更多文档: