【问题标题】:regarding the use of extern keyword关于 extern 关键字的使用
【发布时间】:2015-07-27 17:23:35
【问题描述】:
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;)是定义,为什么下面的代码没有给出多个定义错误?

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

【问题讨论】:

    标签: c extern multiple-definition-error


    【解决方案1】:

    在没有显式初始化的情况下,全局空间中的所有int is 都称为暂定定义。但是,这在本地范围内是不允许的。

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

    具有文件范围的对象的标识符声明没有初始值设定项、没有存储类说明符或具有存储类说明符 static,构成一个暂定定义。如果翻译单元包含一个或多个标识符的暂定定义,并且翻译单元不包含该标识符的外部定义,则 行为与翻译单元包含该标识符的文件范围声明完全相同,复合类型在翻译单元的末尾,初始值设定项等于 0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 2020-04-14
      相关资源
      最近更新 更多