int main()
{
extern int i;
i=20;
printf("%d",i);
return 0;
}
编译器给出一个错误,即'i'未定义
原因是什么?
答案 0 :(得分:7)
通过说extern
,你告诉编译器i
是在另一个翻译单元中定义的,我猜你没有。 C中的声明和定义之间存在差异。简而言之,前者告诉编译器变量的类型,后者告诉它为它分配存储。 / p>
暂时删除extern
。
答案 1 :(得分:7)
差异:
1.int i; // i is defined to be an integer type in the current function/file
2.extern int i; // i is defined in some other file and only a proto-type is present here.
因此,在编译时,编译器(LDD)将查找变量的原始定义,如果它没有找到,它将向'i'抛出错误'未定义的引用。
答案 2 :(得分:6)
i
没有存储位置。
您必须与包含int i;
(不是extern
)的翻译单元相关联。
答案 3 :(得分:2)
允许程序的一个模块访问程序的另一个模块中声明的全局变量或函数。 您通常在头文件中声明了外部变量。 如果您不希望程序访问您的变量或函数,则使用static告诉编译器此变量或函数不能在此模块之外使用。
errno.h中
#ifndef ERRORS /* prevent multiple inclusion */
#define ERRORS 0
extern int errno; <- Declaring the variable to be external.
extern void seterrorcode(int errcode);
#endif
errno.c
#include "errno.h"
int errno; <- This is where the definition of errno occurs
static int stuff; <- This is private to this module.
void seterrorcode(int errcode)
{
errno = errcode;
}
的main.c
#include "errno.h"
/* extern int stuff : This line will produce an undefined variable error when linking */
int main()
{
seterrorcode(0);
if (errno > 0)
; /* Error code > 0, do something */
}
答案 4 :(得分:1)
extern关键字用于告诉编译器该变量
在另一个文件中定义
但在链接期间,链接器不解析变量
所以你得到一个错误
答案 5 :(得分:0)
1.对于这个问题,你需要理解定义是声明的超集。在声明中,我们只引入将要使用的变量,但不为它分配任何内存。但是在定义的情况下,我们都声明并为变量分配内存。
2.int i;
这句话将声明和定义变量i
3.另一方面
extern int i;
这句话只会将变量的可见性扩展到整个程序。有效的是,你只是定义变量而不是声明变量。 I = 20; 这一行试图将20分配给一个不存在的变量。
4.可以通过写
来纠正extern int i = 20;
希望这有帮助!