【问题标题】:Declaration or definition? [duplicate]声明还是定义? [复制]
【发布时间】:2018-04-10 05:14:00
【问题描述】:

我无法理解 extern 的用法以及声明与定义的主题。我不明白为什么

extern int i;

是一个声明(没有内存分配),而

int i;

是一个定义(内存已分配)。

不是两个语句都只声明一个变量iint,只有一个声明它是一个全局变量吗?

【问题讨论】:

  • 那么定义应该如何?
  • 恕我直言,Steve Jessop's answer to that question 非常好。 C 语言中也有全局变量的“暂定定义”的想法。你可以写int i; int i; int i;,它和int i;一样(你可以用static int i;做同样的事情,只要他们都是static)。如果在翻译单元结束之前没有找到外部定义(例如int i = 20;),则在翻译单元末尾隐含int i = 0; 完成,创建一个外部定义。但是链接必须仍然一致,所以static int i; int i; 无效

标签: c variables memory declaration extern


【解决方案1】:

首先让我们澄清声明和定义之间的区别:

变量/函数的声明只是声明变量/函数存在于程序中的某个位置,但没有为它们分配内存。但是变量/函数的声明起着重要作用。这就是变量/函数的类型。因此,当声明一个变量时,程序就知道该变量的数据类型。在函数声明的情况下,程序知道该函数的参数是什么,它们的数据类型,参数的顺序和函数的返回类型。

进入定义,当我们定义一个变量/函数时,除了声明的作用,它还为该变量/函数分配内存。因此,我们可以把定义看作是一个超集的声明。 (或声明为定义的子集)。

从这个解释中,很明显变量/函数可以声明任意次数,但只能定义一次。 (记住基本原则,不能有同一个变量/函数的两个位置)。

由于声明可以进行任意次数,而定义只能进行一次,我们可以注意到函数/变量的声明可以在多个 C/H 文件或单个 C/H 文件中添加多次.但是我们只注意到函数/变量的实际定义一次(即仅在一个文件中)。并且随着 extern 将可见性扩展到整个程序,只要函数的声明已知,就可以在整个程序的任何文件中的任何位置使用(调用)函数/变量。 (通过知道函数的声明,C编译器知道函数/变量的定义存在,并继续编译程序。

对于int a;,它是什么取决于它在源代码中的位置:

  • 在函数内,int a;是一个定义 - 它要求创建一个具有自动存储持续时间的 int 变量(当然
    也是一个声明);

  • 在文件范围内,C 和 C++ 的答案是不同的。在 C 中,int a;是试探性的定义(可以有多个,只要类型和链接是一致的);在 C++ 中,它是一个带有外部链接的普通定义。

  • 在结构或联合说明符内,int a;是成员的声明。

【讨论】:

    猜你喜欢
    • 2014-04-12
    • 1970-01-01
    • 2019-07-28
    • 2021-10-23
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 2011-01-09
    相关资源
    最近更新 更多