C中的重复声明全局变量

Joh*_*ohn 6 c variables global declaration duplicates

为什么这在全球范围内有效:

static int a;
static int a=0;
Run Code Online (Sandbox Code Playgroud)

但不在函数体内:

void foo()
{
    static int b;
    static int b=0; //error: Duplicate declaration of global variable 'b'
    ...
Run Code Online (Sandbox Code Playgroud)

使用clion 2017.3.1,C99,gcc5.4

ser*_*gej 3

第一个在全局范围内,是所谓的暂定定义的示例。

暂定定义是不带初始值设定项的外部声明,并且不带存储类说明符或带说明符 static。

暂定定义是可以充当或不充当定义的声明。如果在同一翻译单元中较早或较晚发现实际的外部定义,则临时定义仅充当声明。

在第二个示例中,b具有块作用域并且没有链接,换句话说:声明不是external。因此,暂定定义规则不适用。