关于extern关键字的使用

时间:2015-07-27 17:23:35

标签: c extern multiple-definition-error

extern int var;

我理解当我们将extern关键字与变量一起使用时,如下所示,不会分配该变量的内存。 (这只是一个声明)

extern int i = 0;

我知道如果我们声明一个extern变量并且还提供一个初始化器以及该声明,那么将为该变量分配内存。

以下程序也是打印0

#include <stdio.h>
int i; // Can I treat this as declaration/definition?
int main()
{
    printf("%d ", i);
    return 0;
}

我觉得,此处为变量i分配了值0

如果(int i;如上所示)是定义,为什么下面的代码没有给出多重定义ERROR?

#include <stdio.h>
int i;
int i;
int i;
int main()
{
    printf("%d ", i);
    return 0;
}

1 个答案:

答案 0 :(得分:4)

如果没有显式初始化,全局空间中的所有int i都称为暂定定义。但是,在本地范围内不允许这样做。

引用C11标准,章节§6.9.2,外部对象定义

  

具有没有初始化程序的文件范围且没有存储类说明符或存储类说明符为静态的对象的标识符声明构成暂定定义。如果翻译单元包含一个或多个标识符的暂定定义,并且翻译单元不包含该标识符的外部定义,则   行为就像翻译单元包含该标识符的文件范围声明一样,复合类型截至翻译单元的末尾,初始化程序等于0。