今天用extern突然发现了extern的另一个特点。
比如,现在operator.c里面有个全局数组变量int arr[5],和三个函数f1,f2,f3.
#include<stdio.h>
#define MAX 5
int arr[MAX]={2,3,4,5,6};
int sum()
{
int i,n;
n=0;
for(i=0;i<MAX;i++)
{
n+=arr[i];
}
return n;
}
int get_max()
{
int max;int i;
i=0;
max=arr[i];
for(i=0;i<MAX;i++)
{
if(arr[i]>max)max=arr[i];
}
return max;
}
然后在另一个函数main.c里调用他们,
#include<stdio.h>
extern int arr[];//第二行
extern int sum();//第三行
extern int get_max();//第四行
extern void print();//第五行
int main(void)
{
int all,max;
all=sum();
max=get_max();
print();
printf("%d,%d\n",all,max);
//printf("%d",arr[0]);
return 0;
}
然后gcc operation.c main.c -o main
要点在第二,第三,第四,第五行,在这里可以去掉第三行、第四行和第五行,但不能去掉第二行,因为函数默认是extern的,而变量不是。
另外,如果在operation.c里,在函数和变量前面加上static,那么它就不可以在外面被引用了,static没有改变全局变量的声明周期(依然在数据段),但却改变了全局变量的作用范围(变小了),加了static的全局变量只能在本文件中引用!