在c中声明与定义变量[重复]

Posted

技术标签:

【中文标题】在c中声明与定义变量[重复]【英文标题】:Declaring vs defining variables in c [duplicate] 【发布时间】:2015-06-30 01:53:40 【问题描述】:

据我所知,这是一个声明:

int i;

这是一个定义:

int i = 10;

也许我错了,我不争辩。

问题是编译器是否为已声明(但未定义)的变量留出内存?

【问题讨论】:

有点相关,当你定义一个尚未声明的符号时,你既声明又定义符号。 C有tentative definition的概念。 这两行都是声明。两者都可以是定义(通常是)。 【参考方案1】:

定义是为变量分配存储空间。声明并不意味着存储空间已经分配。

声明用于访问在不同源文件或库中定义的函数或变量。定义类型和声明类型不匹配会产生编译器错误。

下面是一些在 C 中不是定义的声明示例:

extern char example1;
extern int example2;
void example3(void);

来自C standard (n1256):

6.7 声明 ... 5 声明规定了一组标识符的解释和属性。 标识符的定义是该标识符的声明: — 对于一个对象,导致为该对象保留存储空间; — 对于函数,包括函数体;101) — 对于枚举常量或 typedef 名称,是(唯一的)声明 标识符。

【讨论】:

这当然意味着问题中的两行代码都可以是定义。【参考方案2】:

“编译器是否为已声明(但未定义)的变量留出内存?”

没有。编译器只为(在)变量定义时分配内存,而不是在变量声明时。

通过一个简单的类比可以更好地理解逻辑,单个变量允许多次声明,但不允许多次定义。

【讨论】:

【参考方案3】:

编译器是否为声明的(但未定义的)预留内存 变量?

不,编译器只记下这个变量名和类型。没有为声明分配内存。

如果使用i(未优化)并且i 中的no other definition 存在于任何其他编译单元中,则int i; 可以表现为定义,并且将为它保留存储空间。 (因为存储空间是为定义保留的)

【讨论】:

以上是关于在c中声明与定义变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

extern 用法,全局变量与头文件(重复定义)

c ++ * vs&在函数声明中[重复]

extern 用法,全局变量与头文件(重复定义)

C语言中如何定义全局变量

“定义”和“声明”之间的区别[重复]

C到C++的升级