C标准在哪里指定我不能在同一块范围内多次声明相同的标识符?
答案 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)。在前面的引用中,请记住所有定义都是声明;因为它说没有多个声明没有链接,所以不能有多个定义。