关于C语言中的extern

c语言有三种链接,外部链接,内部链接和无链接。

外部链接:对构成程序的所有文件可用,如函数和全局变量具有外部链接。
内部链接:仅在声明他们的文件中是已知的。如声明为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 <stdio.h>
#include <stdlib.h>
int x,y;
int main(int argc, char *argv[])
{
x=100;
y=10;
printf(“in main x is %d and y is %d\n”,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 %d\n”,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。你明白了么?

参考:

http://blog.csdn.net/yangbc/archive/2006/05/06/710712.aspx

http://www.cnblogs.com/hishope/archive/2008/08/28/1278822.html

7 thoughts on “关于C语言中的extern

  1. Pingback: batmanapollo

  2. Pingback: tsoy

  3. Pingback: 44548

  4. Pingback: 44549

  5. Pingback: hod-korolevy-2020

  6. Pingback: bitly.com

  7. Pingback: HD

Leave a Reply