C链接器的行为不符合预期[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我有两个C文件9.c,10.c。

9.C

#include <stdio.h>
int b=6;
int main()
{
fun1();
printf("%d\n",b);
}
extern int b;

10.C

void fun1()
{
printf("%d\n",b);
b=8;
}

我做了gcc 9.c 10.c但它给出了以下错误:

10.c:3:错误:'b'未声明(首次使用此功能)

我期待链接器会解析b的定义,但为什么它不能解析。

c
1个回答
3
投票

你在9.c结尾处的extern int b;线应该是在10.c的开头。这告诉编译器b的声明在另一个模块中。见How to correctly use the extern keyword in C

更新在回复您的评论以及上面的评论时:当其他人说这个错误来自编译器而不是链接器时,他们特指的是构建过程的“编译”阶段。在此阶段,每个源文件都是独立处理的。因此,您在9.c中声明了b的事实无助于编译器在10.c中识别它。如果要将此标识符的解析延迟到链接阶段,则需要在10.c中对变量进行extern声明,因为这是缺少声明的地方。

在9.c中使用extern声明是没有意义的,因为实际声明在同一文件中较早发生。

我怀疑你正在考虑extern,好像它意味着“导出”,即告诉编译器记住b在9.c中声明的命令,以便它可以解析其他文件中对它的引用。这不是它的意思。这是一个命令,告诉编译器该变量是在当前源文件的外部定义的;所以你将它包含在每个源文件中,其中引用其他地方声明的变量。 (或者更常见的是,它用在包含在此类源文件中的头文件中,例如stdio.h。)

© www.soinside.com 2019 - 2024. All rights reserved.