我有两个.c文件,其中一个有x的定义,另一个文件使用x,如下所示:
file1.c中:
int x;
//other code...
main.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
看不到x
中的file1.c
,那么这次问题是什么?
这是链接错误吗?
请注意,当我添加
时extern int x;
main.c
中的,问题就消失了。
答案 0 :(得分:2)
每个编译单元(在本例中为您的个人.c
文件)分别是编译。编译器需要知道x
的存储类才能处理它,所以你的第一个错误(undeclared
)来自编译器,不知道x
是什么。编译器不需要知道x
所在的位置。
当您将编译后的对象链接时,链接器会解析所有外部名称(如果您已标记x
,则会main.c
中包含extern
)然后最终的可执行文件将其所有变量放在已知位置。如果它找到2个具有相同名称的外部符号,则它将失败,从而导致第二个错误(error: ld returned 1 exit status
)。
答案 1 :(得分:1)
您必须在main.c中声明变量,因此编译器知道它:extern int x
。编译器对你说:错误:' x'未申报强>
您在main.c中添加了x
的第二个定义,这是您在file1.c中执行的第一个定义。链接器告知您两个定义之间的歧义。您可以阅读错误上方的错误:ld返回1退出状态