【问题标题】:Need help to understand the syntax in xv6 kernel需要帮助来理解 xv6 内核中的语法
【发布时间】:2015-02-25 20:21:54
【问题描述】:

我正在读取 xv6 内核的文件,但我无法理解以下内容的含义:

static int (*syscalls[])(void) = {
 [SYS_fork]    sys_fork,
 [SYS_exit]    sys_exit,
 [SYS_wait]    sys_wait,
 [SYS_pipe]    sys_pipe,
...

}

谁能给我解释一下?尤其是方括号(例如 [SYS_fork])的含义。 谢谢

【问题讨论】:

  • 确定不是[SYS_fork] = sys_fork等?至少,我认为那是 C99 指定的初始化语法。
  • @bkail no.. 我直接从源代码复制过来的。
  • 那我不知道。我已经添加了c 标签,希望其他人可以提供帮助。
  • 该系统使用什么编译器?
  • @Jens erm.. 我不知道。我猜.. gcc..?

标签: c xv6


【解决方案1】:

该代码正在创建一个函数指针数组,使用旧的替代 GNU 扩展进行指定初始化。

指定初始化是在 C99 中添加到 C 中的一项功能,可让您指定为数组分配特定值的数组索引,因此它们不需要按顺序排列。结构初始化也存在相同的功能,您可以在其中指定要为其分配给定值的特定字段。

数组指定初始化的 C99 语法是 [index] = value。这段代码特别是使用了来自 GCC 的较旧的替代语法,根据 this document,自 GCC 2.5 以来已经过时,其中没有使用等号。

syscall.c 中,索引是使用syscall.h 中定义的宏指定的,其中第一个定义为syscall.h 中的1 等。

【讨论】:

    【解决方案2】:

    这很可能是一种初始化函数指针数组的非标准方式。标识符SYS_fork 等很可能是指定元素索引的宏或枚举常量。

    另一种可能性是,这不是 C 文件,而是在编译之前使用一些过滤工具将其转换为语法上有效的 C 文件。

    【讨论】:

      猜你喜欢
      • 2021-06-22
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 2015-09-16
      • 1970-01-01
      相关资源
      最近更新 更多