外部函数、静态函数;外部全局变量、静态全局变量

一、外部函数(定义时默认)

在定义函数时,如果在函数首部的最左端冠以关键字extern,则表示此函数是外部函数,可供其他文件调用。

如果在定义函数时省略extern,则默认为外部函数

但是,在调用外部函数时,声明中不可省略extern

/*
另一个文件max.c中
*/
extern int max(int x,int y)//定义时,也可以不加extern,默认即为外部函数
{
    int z;
    z=x>y?x:y;
    return z;
}
#include <stdio.h>
extern int max(int,int);//调用外部函数时,则必须在声明是加上“extern”
int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    printf("%d",max(a,b));
    return 0;
}

二、静态函数(static)

如果一个函数只能被本文件中其他函数所调用,它称为内部函数,又称静态(static)函数。

 如果在不同的文件中有同名的内部函数,互不干扰。

通常把只允许在同一文件中使用的函数和全局变量前面冠以static使之局部化,从而其他文件都不能引用。

三、外部全局变量(定义时默认)

全局变量的作用域仅从定义开始,至文件结束,因此一般全局变量需要定义在最顶端;

#include <stdio.h>
int max(int,int);
int a=1,b=2;//定义的全局变量,作用范围从定义处至文件结束
int main()
{
    printf("%d",max(a,b));
    return 0;
}
//int a=2,b=3;如果全局变量在此处定义,则主函数中无法使用,作用域仅从定义开始
int max(int x,int y)
{
    int z;
    z=x>y?x:y;
    return z;
}

 

1、用extern拓展一个文件内的全局变量的作用范围

注:不用extern,采用“首部定义”的方法,在本文件内同样可以扩展全局变量的作用范围;(不加extern时即默认为外部)

#include <stdio.h>
int max(int,int);
extern int a,b;//声明全局变量a,b,扩展其作用范围!
int main()
{
    printf("%d",max(a,b));
    return 0;
}
int a=5,b=111;//全局变量在此处定义,则主函数中无法使用,作用域仅从定义开始
int max(int x,int y)
{
    int z;
    z=x>y?x:y;
    return z;
}
#include <stdio.h>
int max(int,int);
int a,b;//虽然没加extern,但同样声明了外部全局变量a,b,扩展其作用范围!
int main()
{
    printf("%d",max(a,b));
    return 0;
}
int max(int x,int y)
{
    int z;
    z=x>y?x:y;
    return z;
}
int a=11,b=123;//全局变量的赋值虽然放在了最后,但是程序首部有定义,不妨碍使用!

 

2、用extern声明其他文件中定义的外部变量

使用extern声明就能够在一个文件中调用其他文件中定义的变量,或者说把该变量的作用域扩展到本文件。

慎重扩展全局变量的作用域!

虽然可以为程序设计带来方便

但是执行一个文件中的函数时,可能会改变了该全局变量的值,从而会影响到另一文件中的函数执行结果。

四、静态全局变量

当一个文件中定义的变量

用static声明静态全局变量:限制本文件外使用

定义全局变量时加一个static声明,该变量只限于被本文件引用,而不能被其他文件引用

但是,静态全局变量与静态局部变量一样,在函数调用多次以后,容易搞不清楚当前值。

备注:

对于外部全局变量,要谨慎使用!

例如在同一个项目的不同文件中,都定义了int a,对该项目进行编译时,就会报错;

因此,尽量限制使用外部全局变量。

 

局部变量 自动 auto 定义时不加auto,默认为自动 在动态区存储,当函数执行完时,该变量占用的内存空间被释放,其变量值值变为随机值
静态 static 在函数内定义 长期占用静态存储区,直至程序结束才被释放;多次调用后,变量的当前值不易确定
全局变量 外部 extern 定义时不加extern,默认为外部 静态区存储,可以被其它文件调用,因此同一项目内的不同文件中的函数参数不能使用同一变量名
静态 static 文件中定义 静态区存储,仅在本文件内使用,不能被其它文件使用
         
外部函数 extern 定义时不加extern,默认为外部函数 调用时,必须声明extern;不同文件可调用
静态函数 static 文件内定义 只能被本文件中其他函数所调用,不同文件中的同名函数互不影响。

 

 

猜你喜欢

转载自blog.csdn.net/pl0020/article/details/81297977