我对静态和外部存储类感到非常困惑。我不明白下面的代码片段有什么问题。我希望 printf 打印零值。构建失败并出现错误“未定义对 'i' 的引用”。我希望语句“extern int i”是有效的C语句。不是吗?
#include<stdio.h>
void main()
{
extern int i;
printf("%d", i);
}
我对静态和外部存储类感到非常困惑。我不明白下面的代码片段有什么问题。我希望 printf 打印零值。构建失败并出现错误“未定义对 'i' 的引用”。我希望语句“extern int i”是有效的C语句。不是吗?
#include<stdio.h>
void main()
{
extern int i;
printf("%d", i);
}
在函数中main
extern int i;
是 的声明,i
而不是定义。它必须在某个地方定义。
#include<stdio.h>
int i; //definition
int main()
{
extern int i; //declaration
printf("%d", i);
}
在此示例中,声明有效,但可以省略。
当您将变量声明为extern
函数内部时,编译器认为该变量是在其他翻译单元中定义的。如果它没有在其他任何地方定义,那么您将收到一个链接器错误,指出链接器找不到该变量。
看看当你在 main 中使用 extern 存储类时,我们的编译器使用在特定位置搜索变量的声明,这里 extern 代表编译器,该变量在程序中的任何位置声明,它可以是本地的或外部的scope ,如果它没有找到任何声明,那么它会给出这个链接错误,因为它无法找到变量声明。