【问题标题】:The concept of a type name scope in C11C11 中类型名称范围的概念
【发布时间】:2014-04-14 08:13:17
【问题描述】:

ISO C11 标准(我只能访问草稿版本,n1570.pdf)在 6.2.1.8 中声明(C99 标准中没有这样的段落):

作为一种特殊情况,类型名称(不是 标识符)被认为有一个范围开始于 放置在类型名称中将出现省略标识符的位置 是不是省略了。

我正在寻找对以下内容的任何解释:

1) 部分 (6.2.1) 的名称是“标识符范围”。这一段的措辞我不清楚:“类型名称范围”是一种范围,类似于,例如块范围,文件范围等?或者它是类型名称本身的范围(在这种情况下,另一个问题是没有名称的对象如何具有范围以及这种范围的可能用途是什么)。

2) 这个定义在哪里重要?更具体地说,如果将类型名称的范围更改为在相应类型名称完成后立即开始,那会产生什么影响?唯一可以跟在抽象声明符(=类型名称)中省略标识符之后的标记是几个括号和参数名称列表或数组维度(内部带有表达式),它们都不能引用所讨论的类型名称,因为有没有可参考的标识符。为什么不等到声明器完成?

【问题讨论】:

  • +1 您花时间剖析标准中的引用足以对此进行投票。
  • 仅供参考:ISO/IEC 9899:2011 §6.2.1 ¶8 中的措辞与您引用的相同。
  • 我不确定,但与struct xyz { ... }; 相关的措辞是不是标识符声明的类型名称(struct xyz)?它将被认为具有从分号到封闭范围末尾的范围(如果它出现在任何函数之外,则为文件;如果它出现在函数内部,则为块)。
  • 好吧,在这种情况下,xyz 的范围正好在 { 之前(或者在第二种情况下,在 xyz 之后),而有问题的措辞是指将在之后开始的范围'}'。下面提到 DR341 的 aswer 是我正在寻找的。感谢大家的帮助!

标签: c scope c99 language-lawyer c11


【解决方案1】:

此措辞是Defect Report #341: [*] in abstract declarators 的主题,它讨论了在C99 标准中type-name 没有范围但在某些情况下需要范围,因此C99 需要修复的问题。缺陷报告说(强调我的):

6.7.5.2#4 说 * 作为数组大小“只能在具有函数原型范围的声明中使用”,第 5 段说“如果大小是一个不是整数常量表达式的表达式:如果它发生在函数原型范围的声明中,它被视为被 *" 替换。

但是函数原型中的类型名称是声明,它是否具有函数原型范围?范围仅在 6.2.1 中为标识符定义,并且此类类型名称不声明标识符。抽象声明符语法中 [*] 的存在表明

void f(int (*)[*]);

旨在有效且无效 f(int (*)[a]);旨在等效于它,但没有涉及函数原型范围内的声明。 [...]

目前的措辞是该问题的解决方案,cmets 包括以下内容:

看来问题完全取决于类型名称不是声明并且没有声明标识符,因此它没有范围。而不是添加复杂的措辞避免使用 DR 中建议的术语“范围”,修改 Scope 的定义以使其适用于类型名称似乎更清晰,在 6.7.6 中将其描述为“语法上的声明用于省略标识符的该类型的函数或对象”。

这也影响了6.7.5.24 部分中的措辞,它改变了短语:

[...]具有函数原型范围的声明[...]

到:

[...]具有函数原型范围的声明或类型名称[...]

【讨论】:

  • 对于您最后的评论,您的意思是 6.7.6.2(4) 吗?非常感谢您的解释!我一直在寻找合适的 DR,但没有成功。再次感谢。
  • @alexsh 在 C99 草案中是 6.7.5.2,在 C11 草案中是 6.7.6.2。之前的question 也可用于链接到标准草案。
  • 再次感谢,我在看 C11。
  • @alexsh 没问题,这对我来说很有趣。我喜欢让我思考的问题。尽管有时这些语言律师问题没有令人满意的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 2021-11-28
  • 2017-03-12
相关资源
最近更新 更多