ARM GCC报错‘无链接性重声明myVariable’,求解释linkage含义
关于ARM GCC报错里“linkage(链接性)”的解释及重声明问题
什么是Linkage(链接性)?
Linkage是C语言里的核心概念,用来管控变量/标识符在不同代码块、不同源文件之间的可见性和关联规则,分为三类:
- 外部链接性:这类标识符在整个程序的所有源文件里都能访问,比如没加
static的全局变量、全局函数。不同源文件里声明的同名外部链接变量,会被链接器当成同一个实体。 - 内部链接性:这类标识符只能在当前源文件里使用,比如加了
static的全局变量、全局函数。不同源文件里的同名内部链接变量是完全独立的,互相不产生影响。 - 无链接性:这类标识符只能在自己所在的局部代码块(
{}内部)生效,比如函数里没加static的局部变量。这类变量的作用域被严格限制在代码块内,不同代码块里的同名变量互不干扰,但同一个代码块里绝对不能重复声明——这就是你碰到报错的直接原因。
为啥有链接性时重声明就可行?
C语言允许对有链接性的变量做“外部声明”,本质是告诉编译器“这个变量已经在别的地方定义过了,我只是引用它而已”,并非重新创建新的变量实体:
- 比如外部链接性的变量,你可以在同一个源文件的不同位置,或者其他源文件里用
extern声明它:
这种情况不属于重复定义,所以编译器不会报错。// 全局作用域的定义(真正创建变量实体) float myVariable; // 同一文件其他位置的声明(仅引用已存在的变量) extern float myVariable; - 对于内部链接性的变量(加
static的全局变量),虽然它只能在当前源文件内可见,但你也可以在同一文件里用extern引用它,只要不是在同一个局部代码块里重复定义无链接性的变量,就不会触发你遇到的这个错误。
回到你的报错:两次float myVariable;都是在同一个局部代码块里定义的无链接性变量,相当于要在同一个作用域内创建两个同名的独立变量,这违反了C语言的作用域规则,所以编译器才会报“无链接性的重声明”错误。
内容的提问来源于stack exchange,提问作者beyarkay
相关产品推荐
相关产品推荐

