C 标准定义两个标识符具有相同的范围当且仅当它们的范围终止于同一点。并进一步指出:
结构、联合和枚举标记的范围紧随标记出现在声明标记的类型说明符中之后开始。每个枚举常量的作用域都在其定义枚举数出现在枚举数列表中之后开始。任何其他标识符的范围都在其声明符完成后开始。
这是否意味着两个标识符被正式调用为具有相同的范围,即使它们的范围的开头不匹配?
C 标准定义两个标识符具有相同的范围当且仅当它们的范围终止于同一点。并进一步指出:
结构、联合和枚举标记的范围紧随标记出现在声明标记的类型说明符中之后开始。每个枚举常量的作用域都在其定义枚举数出现在枚举数列表中之后开始。任何其他标识符的范围都在其声明符完成后开始。
这是否意味着两个标识符被正式调用为具有相同的范围,即使它们的范围的开头不匹配?
是的,这是一种合理的思考方式。否则没有两个标识符将具有相同的范围!
{
int a;
int b;
}
在上面, 和 的范围a
开始b
于不同的点,但我们当然希望将它们视为在同一个范围内!
你感到困惑是可以理解的。然而,这实际上只是一个定义问题。在C99 标准的最新委员会草案第 6.2.1 段中:
第 2 项:
对于标识符指定的每个不同实体,标识符仅在称为其范围的程序文本区域内可见(即,可以使用)。
第 6 项:
当且仅当它们的作用域在同一点终止时,两个标识符具有相同的作用域。
因此,正如您所看到的,术语“相同范围”是一个定义问题,并不意味着范围从同一位置开始,或者对象所在的程序区域完全相同。因此,也如上一个答案所述:
{
int a;
int b;
}
总结一下:是的,变量 a 和 b 的作用域从不同的点开始,但是因为它们的作用域在同一点结束,所以它们根据 C 标准定义被称为“相同的作用域”。