用于初始化数组/结构的不熟悉的语法,寻找解释

时间:2012-03-15 22:48:46

标签: c syntax c99 c11 aggregate-initialization

我正在查看由名为OVP的公司(类似于qemu的产品)提供的“处理器建模指南”。在其中,有一个类似于以下内容的小代码片段:

static or1kDispatchTableC dispatchTable = {
  // handle arithmetic instructions
  [OR1K_IT_ADDI] = disDefault,
  [OR1K_IT_ADDIC] = disDefault,
  [OR1K_IT_ANDI] = disDefault,
  [OR1K_IT_ORI] = disDefault,
  [OR1K_IT_XORI] = disDefault,
  [OR1K_IT_MULI] = disDefault
};

我以前从未见过这样的语法。 关于C ++的不相关内容已删除

目前我没有能力下载/查看他们的东西,看看有什么定义,因此我的问题。如果您认识到这种语法,可以权衡一下吗?


修改

or1kDispatchTableC是类型为or1kDispatchTableCP的指针的typedef,但我仍然没有关于or1kDispatchTableCP的内容。

2 个答案:

答案 0 :(得分:5)

好吧,假设你的第一行是拼写错误,或or1kDispatchTableC是一个数组类型,所以这实际上是一个数组声明,这看起来像一个C11显式初始化数组。这条线

[OR1K_IT_ADDI] = disDefault,

将元素OR1K_IT_ADDI初始化为disDefault。这两个都需要是常量表达式 - OR1K_IT_ADDI可能是#define或枚举标记。

我非常确定C ++ 11不支持这种语法,但有些编译器(也支持C11)可能会支持它作为扩展。

从名称来看,我猜这实际上是一个函数指针数组。

答案 1 :(得分:2)

这称为指定的初始值设定项,是C功能(自C99起支持)。它允许直接寻址数组和结构/联合元素,用默认值填充空白。

struct foo { int a[10]; };
struct foo f[] = { [5].a[3] = 20 };

现在,这会产生5 struct foo元素,所有元素都被初始化为零,然后是struct foo的第六个元素,其中a的第4个元素初始化为20。 / p>

与其他人怀疑,C ++不支持此功能。