在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中声明与定义变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章