澄清范围和重新定义

Pra*_*bhu 4 c

参考下面的代码:

#include <stdio.h>

int a;
int a;

int main()
{
    int b;
    int b;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么编译器(GCC)仅仅为变量'b'而不是'a'抱怨重新声明?

redef.c:在函数'main'中:redef.c:19:错误:重新声明没有链接的'b'

redef.c:18:错误:之前的'b'声明就在这里

pax*_*blo 8

这是因为a有外部联系和标准状态(C11,6.2.2/2):

可以使用在不同作用域或同一作用域中多次声明的标识符通过称为链接的过程来引用相同的对象或函数.有三种联系:外部,内部和无.

在构成整个程序的翻译单元和库的集合中,具有外部链接的特定标识符的每个声明表示相同的对象或功能.在一个翻译单元内,具有内部链接的标识符的每个声明表示相同的对象或功能.没有链接的标识符的每个声明表示唯一的实体.

因此,因为a有外部链接,这两个声明都引用相同的底层变量.因为b没有链接,声明引用唯一变量,因此相互冲突.