外部链接的静态变量具有文件作用域、外部链接和静态存储期。
该类别有时候称为外部存储类别,属于该类别的变量称为外部变量。
把变量的定义性声明放在所有函数的外面便创建了外部变量。当然,为了指出该函数使用了外部变量,可以在函数中用关键字extern再次声明。
如果一个源码文件使用的外部变量定义在另一个源码文件中,则必须用extern在该文件中声明该变量。
例子:
int A = 1;
int Array[22]; //这俩都属于外部定义的
extern char name; //这是声明的name在其他文件中被定义了,在这个文件使用。
int main(void)
{
extern int A;
extern int Array[]; //这俩是可省略的
/*
假如:
int A;
int Array[];
这样不对!!会屏蔽块作用域外的同名变量。
*/
}
还有一种情况
int main(void)
{
}
int B;
int function1(void)
{
}
B是外部变量,但只对function1()函数可见!!
外部变量的作用域:从声明处到文件结尾。
定义和声明:
int A = 1; //定义A
int main(void)
{
extern int A; //使用在别处定义的A
}
第一次声明为“定义式声明”。第二次声明为“引用式声明”。
关键字extern表明该声明不是定义,而是指示编译器去别处查找其定义。
只能用extern来引用现有定义。程序读到extern时,并不会对其分配存储空间。
不能用关键字extern创建外部定义,只能用它来引用现有的外部定义。
外部变量只能初始化一次,且必须在定义该变量时进行。
C程序通常有许多单独源码文件。有时候,这些文件可能共用一个外部变量。 C 通过在一个文件中进行定义式声明,然后在其他文件中进行引用式声明来实现共享。除了一个定义式声明外,其他声明都要使用extern关键字。而且,只有定义式声明才能初始化变量。
在使用extern声明前,不能直接使用变量。(不声明,你啷个找的到)
外部函数:
int function_A(void); //默认外部函数
static int function_B(void);
extern int function_C(void);
在其他函数中,可以调用function_A()、function_C(),但是不能使用function_B()。
因为static表明该函数属于特定模块私有。function_B()受限于所定义的文件,故,其他文件中可定义于function_B()同名的函数。(没啥子用)别玩这么花!!!
通常:extern声明定义在其他文件中的函数,方便调用。