【问题标题】:Unfamiliar syntax for initializing an array/struct, looking for explanation初始化数组/结构的语法不熟悉,求解释
【发布时间】:2012-03-15 22:48:46
【问题描述】:

我正在浏览一家名为 OVP(类似于 qemu 的产品)的公司提供的“处理器建模指南”。其中,有一段小代码 sn-p 类似于以下内容:

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++ 无关的内容

目前我没有能力下载/查看他们的东西来查看任何东西是如何定义的,因此我的问题是。如果你认识这个语法,你能权衡一下吗?


编辑

or1kDispatchTableCor1kDispatchTableCP 类型指针的 typedef,但我仍然不知道 or1kDispatchTableCP 是什么。

【问题讨论】:

  • 在过去几年中,要么 C++ 的变化比我想象的要大(很有可能),要么有人对 [] 运算符进行了一些奇怪的重新定义。我将开始深入研究 or1kDispatchTableC 的构造函数/赋值运算符定义,然后弄清楚它试图采用什么。但是不,以前从未见过。
  • 可能要等到我可以访问他们的标题才能获得完整的答案。
  • [] 运算符有什么用?没有左手边..
  • 如果 this (ovpworld.org/documents/OVP_Processor_Modeling_Guide.pdf) 可以通过,or1kDispatchTableC 是一个函数指针数组,而 OR1K_IT_* 都是枚举标签。

标签: c syntax c99 c11 aggregate-initialization


【解决方案1】:

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

[OR1K_IT_ADDI] = disDefault,

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

我很确定 C++11 不支持这种语法,尽管一些编译器(也支持 C11)可能支持它作为扩展。

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

【讨论】:

  • 此处的“C11”可能看起来像仅从 C11 开始支持的内容。但是指定的初始化器从 C99 开始就有效了。
  • 谢谢,原来如此。作为参考,这里是关于它的 GCC 文档:gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
【解决方案2】:

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

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

现在这会导致 struct foo5 元素全部初始化为零,然后是 struct foo 的第六个元素,a 的第四个元素初始化为 20。

就像其他人怀疑的那样,C++ 不支持这一点。

【讨论】:

  • 谢谢你的例子,你说的很对;它甚至没有作为 g++ 的扩展来实现。
猜你喜欢
  • 2020-08-15
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多