块范围的变量 - 许多声明 - 标准?

时间:2017-01-31 12:26:24

标签: c language-lawyer

C标准在哪里指定我不能在同一块范围内多次声明相同的标识符?

2 个答案:

答案 0 :(得分:5)

可以重新声明某些标识符 ,例如struct标记和extern个对象。但局部变量不能:

void bar(void)
{
    int a;
    int a; // constraint violation, 'a' declared a second time
}

这是C99第6.7节第3段所要求的:

  

如果标识符没有链接,则标识符的声明不得超过一个   (在声明符或类型说明符中)具有相同的作用域和相同的名称空间,除外   对于6.7.2.3中指定的标签。

这是"将"约束中的句子"约束"部分,所以违反它的程序是不正确的。

C标准从不使用术语"局部变量,"但是一个"标识符[that]没有链接"是几乎同样的事情。 (您可以看到它不完全相同,或者不需要为标记做出异常。)有关精确定义,请参阅第6.2.2节。

(C2011稍微修改了这一段,允许重复typedef声明和标签。)

答案 1 :(得分:0)

您可以在块范围内多次声明相同的标识符:

int main()
{
    extern int x;
    extern int x;
    extern int x;
}

这里我们在块范围内有三个x声明。这是有效的,因为它们都具有兼容类型(C11 6.7 / 4)和相同的链接。

我认为您的意思是为什么您不能多次定义相同的标识符作为变量。这由C11 6.7 / 3涵盖:

  

如果标识符没有链接,则标识符的声明(在声明符或类型说明符中)不得超过一个具有相同范围的声明[...]

关于链接的部分,6.2.2涵盖了“无连接”一词。在块范围内定义的变量具有“无链接”(6.2.2 / 6)。在前面的引用中,请记住所有定义都是声明;因为它说没有多个声明没有链接,所以不能有多个定义。