【问题标题】:How do triple dots in this C macro body work?这个 C 宏主体中的三个点是如何工作的?
【发布时间】:2019-09-12 11:29:55
【问题描述】:

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

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

【问题讨论】:

  • 它用于case 语句或类似的构造(它使用 GNU C 扩展)。

标签: c gcc macros


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 2018-07-17
      • 2016-02-22
      • 2013-07-24
      • 2012-11-14
      相关资源
      最近更新 更多