【问题标题】:What does the ISO/IEC 9899 6.8.4.2 ->2 phrase mean? [duplicate]ISO/IEC 9899 6.8.4.2 ->2 短语是什么意思? [复制]
【发布时间】:2013-08-27 07:55:31
【问题描述】:

我不明白这是什么意思。 我已经认为这可能意味着代码就像我在这个问题的代码 sn-p 中一样:

Skipping switch cases via false loop is a valid operation?

但是作为回答者,他们只是在哪里改进代码并忽略了我关于 c99 报价的问题,我现在要在这里明确地问这个问题:

如果一个 switch 语句在一个范围内有一个关联的 case 或 default 标签 具有可变修改类型的标识符,整个 switch 语句应在 该标识符的范围。135)

这是脚注:

135) 也就是说,声明要么在 switch 语句之前,要么在最后一个 case 之后,或者 与包含声明的块中的开关关联的默认标签。

谁能这么好心地向我解释一下? 感谢您的努力。

【问题讨论】:

  • @SanderDeDycker:老实说,另一个是这个的副本......
  • 参考。 cmets 在另一个问题中 - 建议以相反的方式进行,因为那里的答案似乎更深入。
  • @dhein 如果你想讨论它,我建议我们在 meta 上打开一个线程。一般来说,我们在投票和近距离投票时应该只关心技术质量。关闭这个问题不会影响任何人的代表,因为它已被投票和接受。

标签: c c99


【解决方案1】:

首先请注意,这句话仅适用于可变修改类型的标识符,即在其描述中某处具有动态数组维度的类型。对于n 类似的变量

double a[n];
unsigned (*B)[n][n];

与这种标识符相关联的对象有一个特殊的生命周期规则,它只从声明点开始,而对于其他类型,它从进入范围开始。

您引用的段落是为了确保switch 语句的所有case 根据此类对象的生命周期具有相同的属性。对象的生命周期在任何情况之前已经开始,或者它仅在任何case(或default)标签之后开始。

所以本质上它只是表明你不应该混合使用 VLA(或类似的)和跳转语句,因为你不知道大小是什么以及数组的内存(如果有的话)在哪里被分配。

【讨论】:

  • 所以“可变修改类型”并不意味着非 const 变量,它意味着在编译时不知道内存大小,不是吗?
  • @Zaibis,本质上是的。这样一个编译未知的内存大小,或者一个指向这样一个野兽的指针。问题是双重的,不仅必须在某处分配对象的内存,还必须初始化某种隐藏状态(sizeof 返回的值)。
猜你喜欢
  • 2013-10-13
  • 1970-01-01
  • 2011-11-18
  • 2017-07-08
  • 2016-08-18
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
相关资源
最近更新 更多