关于C语言中的extern
By admin
- One minute read - 100 wordsc语言有三种链接,外部链接,内部链接和无链接。
外部链接:对构成程序的所有文件可用,如函数和全局变量具有外部链接。 内部链接:仅在声明他们的文件中是已知的。如声明为static的文件域具有内部链接。 无连接:仅在自己的块中已知,其它地方没有办法访问,如局部变量。
extern主要作用是:声明在程序的其它地方使用外部链接声明的对象。 声明:表述对象的名称和类型。 定义:为对象分配存储空间。
例如:
int main(void) { extern int a, b; printf(“%d %d”, a, b); getch(); return 0; }
/* 全局变量定义到了main之后 */
int a = 10, b = 20; 程序输出10 20。
通过extern声明变量a和b,可以在a和b定义之前使用,编译器不会提示错误。
extern最重要的用途是多文件程序,c允许程序分散在多个文件中,分别编译,链接到一起。 我们在devc++中新建立一个c工程,然后在添新建一个单元保存名称为cunclx3.c
main.c的程序代码:
#include #include int x,y; int main(int argc, char *argv[]) { x=100; y=10; printf(“in main x is %d and y is %dn”,x,y); fun(); getch(); system(“PAUSE”); return 0; }
cunclx3.c的程序代码是:
extern int x,y; void fun(void) { x/=y; y/=2; printf(“in fun x is %d and y is %dn”,x,y); }
调试运行,没有问题程序正常输出,可以尝试将extern int x,y;代码加上注释,编译器将提示错误。
extern使编译器知道这些全局变量的名字和类型,同时不再分配内存,当链接程序链接各个文件的时候,自动处理所有对外部变量的引用。 在使用过程中,我也曾遇到过extern的问题:我在文件a中声明了“unsigned long a[2];”,然后在程序中给这个数组赋值,比如说赋值为“a[0]=20;a[1]=50;”,文件a中的操作完成了!然后我在文件b中想使用这个数组a[ ],那么我在文件的开头先进行外部变量声明“extern short a[ ];”,请注意我在声明的时候变量类型不小心给声明错了,由原来的long型声明成了short型,大家考虑一下会出现什么问题!我在文件b的程序处理中,想对数组中的这两个数求平均值“unsigned long c; c=(a[0]+a[1])/2;”,可是我发现每次得到的c值都是a[0]/2,让我百思不得其解,就在我快要放弃并判断编译器存在问题的时候,我意外发现了上面提到的外部变量声明时的疏忽,改过来以后一切ok!终于明白了,数据类型决定了变量所占的字节数,这样文件a中的a[]数组为每个long型数组元素分配了4个字节单元,而文件b在使用过程中将数组a[]作为short型数据进行处理,当然执行不到第二个元素了,所以只能求得一个元素的1/2。你明白了么?
参考: