1、extern主要涉及的问题就是变量作用域。
extern用于将定义在程序中某个位置的全局变量或文件内部静态变量的作用域扩展到extern所在的作用域中extern所在行的下方。
看例子:
int a = 100;
int main(){
int a = 99;
{
int a = 88;
if (a == 88)
{
extern int a;
printf("%d", a);
}
}
return 0;
}
extern int a所在作用域中extern int a的下方只有一条printf语句,extern的作用这里是扩展全局变量的作用域,所以printf编译时起作用的是全局变量a。
有了这个特性,我们就可以游刃有余地处理全局变量和局部变量重名的问题了。
2、extern一个函数有什么用?
没啥用。(可能的作用是暗示别人这个函数可能是在别的文件里面定义的)。
3、extern "C"
在C++里面用到的。C++编写的库中的函数的名称会发生变化,这是为了实现函数多态。C++编译器在解析外部库的时候默认按照C++的方式来解析,会尝试还原出函数原来的名字‘。如果导入的是C编写的库,函数名没有经过C++那种方式的处理,就会被还原出错误的名称。为了阻止还原名称的操作,就需要程序员告诉编译器,此库是C写的,不要进行还原。extern "C"起的就是这个作用。
4、extern还需要注意什么
一、static变量和函数的作用范围是文件内的,因为编译时不会生成static变量、函数的导出符号,所以不能在别的文件中使用该static变量/函数。
二、定义数组和定义指针不一样,所以int a[88]不能通过extern int * a来声明。extern int * a声明的是 int * a。