>我有两个.c文件,其中一个有x的定义,另一个文件使用x,如下所示:
文件1.c:
int x;
//other code...
主.c:
int main(void)
{
printf("%d", x);
}
现在,当我编译此代码时,我收到以下编译错误消息:
In function 'main':
error: 'x' undeclared (first use in this function)
因此,如果全局变量(在本例中为 x
(默认为"extern",那么为什么main.c
文件看不到x
?
当我现在转到main.c
并定义x
时,main.c
现在看起来像:
int x=9; //This line was added.
int main(void)
{
printf("%d",x);
}
并在 file1.c 中初始化 x,程序无法编译,我收到以下错误消息:
error: ld returned 1 exit status
那么,如果main.c
看不到file1.c
中的x
,那么这次有什么问题呢?
这是链接错误吗?
请注意,当我添加
extern int x;
在main.c
,问题消失了。
每个编译单元(在本例中为单独的.c
文件(都是单独编译的。编译器需要知道x
的存储类才能处理它,所以你的第一个错误(undeclared
(来自编译器不知道x
是什么。编译器不需要知道x
住在哪里。
然后,当您将编译的对象链接在一起时,链接器会解析任何外部名称(包括main.c
中的x
,如果您已将其标记为extern
(,然后最终可执行文件的所有变量都将位于已知位置。如果它找到 2 个同名的外部符号,那么它将失败,给你第二个错误 ( error: ld returned 1 exit status
(。
-
您必须在 main.c 中声明变量,以便编译器知道它:
extern int x
.编译器对你说:错误:"x"未声明 -
您在 main.c 中添加了
x
的第二个定义,这是您在 file1.c 中执行的第一个定义。链接器告知您两个定义之间的歧义。您可以读取错误行上方的错误:ld 返回 1 个退出状态