extern、static 关键字在函数、全局变量、局部变量的作用各不相同。具体如下:
a.c
#include <stdio.h>
/*
extern void printA();
extern 可省略
外部函数声明
*/
void printA();
void printB();
void printD();
//内部函数声明
static void printC();
//外部变量定义
int a;
//内部变量定义
static int b=100;
int main()
{
a=10;
printf("a=%d\n",a);
printB();
printC();
printf("------------------------------\n");
printD();
printD();
}
/*
extern void printA()
extern 可以省略
代表此函数为外部函数,可被其他文件访问
*/
void printA()
{
printf("extern printA\n");
}
/*
static 不可省略
代表内部的函数printC(),只允许本文件使用
*/
static void printC()
{
printf("static printC\n");
}
void printD()
{
//非static的局部变量,每次调用printD()都会重新初始化。
int aa=10;
aa++;
//static的局部变量,多次调用printD()只初始化一次。
//变量bb的生命周期知道程序结束才结束(值一直会保留到程序结束)
static int bb=10;
bb++;
printf("aa=%d, bb=%d\n",aa,bb);
}
b.c
#include <stdio.h>
//extern void printA();
void printA();
//错误写法,此函数为a.c中的内部函数,不允许这里访问
//void printC();
//外部变量声明
extern int a;
//多个文件相同名字的外部变量,值共享
int a;
//extern void printB()
void printB()
{
printf("extern printB\n");
printA();
//printC();
a++;
printf("a=%d\n",a);
//这里无法访问变量b,因为b为a.c的内部变量
//extern int b;
//printf("b=%d\n",b);
}
运行结果
a=10
extern printB
extern printA
a=11
static printC
------------------------------
aa=11, bb=11
aa=11, bb=12