C11中类型名称范围的概念

时间:2014-03-10 23:26:16

标签: c scope c99 language-lawyer c11

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

  

作为特例,一个类型名称(不是一个声明   标识符)被认为具有在...之后开始的范围   放置在省略标识符出现的类型名称中   它没有被省略。

我正在寻找以下任何解释:

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

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

1 个答案:

答案 0 :(得分:4)

这个措辞是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]);旨在等同于它,但没有涉及函数原型范围的声明。 [...]

目前的措辞是这个问题的解决方案,评论包括以下内容:

  

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

这也影响了6.7.5.2 4 中的措辞,它改变了以下短语:

  

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

为:

  

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