关于语句int i;是声明还是定义的技术咨询及编译疑问
关于C语言中
int i;的声明与定义问题解析 1. int i;到底是声明还是定义?
这取决于它所在的作用域:
- 全局作用域(函数外部):
int i;属于暂定定义(tentative definition),本质上是定义的一种。编译器会为它分配内存,默认初始化为0。 - 局部作用域(函数内部):
int i;是明确的定义,编译器会在栈上为它分配内存,未初始化时存储的是随机垃圾值。
2. 你的疑惑纠正:“未初始化变量在函数外部是声明、内部是定义”的说法不对
函数外部的int i;不是单纯的声明——单纯的全局变量声明需要用extern关键字,比如extern int i;,这种声明不会分配内存,只是告诉编译器“这个变量在其他地方已经定义了”。而不带extern的int i;(全局)是暂定定义,属于定义范畴。
3. 为什么全局多次写int i;能编译,局部不行?
- 全局作用域:C标准允许同一个翻译单元(单个
.c文件)中存在多个同名的暂定定义,编译器会自动将它们合并为一个单一的定义,因此不会触发编译错误。 - 局部作用域:C语言要求局部作用域内的标识符必须唯一,重复定义同一个变量违反了这一规则,所以编译器会直接报错。
内容的提问来源于stack exchange,提问作者Terese Nay
相关产品推荐
相关产品推荐

