You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中变量重声明是什么?重声明与重定义有何区别?

变量重声明错误与重声明、重定义的区别

你的问题场景

你编译这段C代码:

#include <stdio.h>
int main(){
    int i; // 既是声明也是定义
    int i;
    return 0;
}

得到的错误是redeclaration of ‘i’ with no linkage,而非预期的重定义错误,这是因为C语言对局部变量的声明规则有明确限制,下面详细解释。


什么是重声明错误(Redeclaration Error)

重声明错误是指在同一作用域内,对无链接属性(no linkage,比如局部自动变量)的变量进行重复声明,且违反C语言声明规则时触发的错误。

对于局部自动变量来说,int i;这种写法既是声明(告诉编译器变量存在)也是定义(为变量分配内存)。C标准不允许在同一个块作用域内重复声明这类变量——这相当于试图创建两个同名的局部变量,会导致命名冲突,所以编译器直接抛出重声明错误。


重声明与重定义的核心区别

维度重声明(Redeclaration)重定义(Redefinition)
本质同一作用域内多次声明变量,违反声明规则试图为同一个变量多次分配内存,或为函数提供多次实现
触发场景1. 局部作用域内重复声明无链接属性变量(你的例子)
2. 声明的变量类型与之前不兼容(比如先int i;再char i;)
1. 全局变量在多个源文件中被定义(未用extern)
2. 同一函数被多次实现
触发阶段通常在编译语法检查阶段触发可能在编译或链接阶段触发(全局变量重定义多发生在链接期)
解决方式去掉重复的局部变量声明;如需引用外部变量用extern(extern int i;可重复声明)全局变量仅在一个文件定义,其他文件用extern声明;函数仅保留一个实现

举个重定义的例子:
在file1.c中写:

int global_var = 10;

在file2.c中也写:

int global_var = 20;

链接时就会报multiple definition of ‘global_var’的重定义错误。

而如果是在同一作用域内写:

extern int i;
extern int i;

这属于合法的重复声明,不会报错,因为extern仅做声明,不分配内存。


内容的提问来源于stack exchange,提问作者YQ CUI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 02:50:14