c - 声明还是定义?

标签 c variables memory declaration extern

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

extern int i;

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

int i;

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

这两个语句不都只是声明一个变量i作为int ,只有那个指定它是全局变量?

最佳答案

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

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

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

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

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

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

  • 在函数内,int a;是一个定义 - 它请求创建一个具有自动存储期限的 int 变量(当然还有
    也是一个声明);

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

  • 在结构或 union 说明符中,int a;是成员(member)的声明。

关于c - 声明还是定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49745777/

相关文章:

function - Matlab 中带有函数名的变量的警告

python - 在内存中加载大型字典的巨大内存使用量

ios - 检查对象引用计数的简单方法

c++ - 二叉搜索树(插入时如何检查是否内存不足)

C 分割字符串函数在字符串末尾返回\377 而不是\0。为什么?

java - 移动 3 个对象但保持它们对齐的公共(public)方法

c - 我怎样才能摆脱这个c警告?

java - java中静态变量的值的存储

c - ProC 在 10g 上编译并在 11g 上运行

c - 用户使用 wtmp 在线花费的时间