1、extern的作用是什么?
1、extern是C、C++语言中表明函数和全局变量作用范围的关键字。
2、extern可以置于变量或者函数前, extern标识的变量或函数声明定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
3、对于extern变量来说,仅仅是一个变量的声明,其并不是定义,因为不会分配内存空间。一个变量可以声明多次,但如果该变量定义多次,会有链接错误。
4、extern表示将变量或函数声明为外部链接,【变量默认是内部链接,函数默认是外部链接】。因此用来外部链接的函数,声明时有无extern都可以链接通过。而全局变量则不行。通常,在模块的头文件中,对本模块提供给其他模块引用的函数和全局变量以关键字extern声明。也就是说C头文件里面定义了一个函数或变量,如果该函数或变量开放给外部,则在h文件中用extern加以声明。外部文件只include该.h文件就可以了。而且编译阶段,外面是找不到该函数的,但是不报错。link阶段会从定义模块生成的目标代码中找到此函数或变量。
5、指明编译语言,也就是很常用的extern C。
2、extern区分C/C++的底层原理是什么?
答:因为C++支持多态,也就是说具有相同名字的函数可以执行不同的功能。它通常是根据参数来区分具体的调用,那换句话说,CPP编译器会将参数类型和函数名字连接在一起,这样编译器就可以根据符号名字的参数进行链接。但C语言由于完全没有多态的概念,因此他在编译时只会在函数名的前面加一个下划线。由于这样的原因,C++和C的代码在混合编程的时候就会出现问题。
3、extern “C”
(在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,应该如何解决这种情况呢?)
答:C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。