最近在准备找工作,看到了不少面试题都会考察到c++中extern “C”关键字的应用,原来对这个关键字的应用不多,所以对其原理和用途也不是很清楚,现在遇到了这方面的题目,所以下决心要把这个问题搞懂,通过查阅资料以及代码实验,对这个关键字的应用有了一些心得,特分享如下。
extern关键字,大家应该都比较熟悉,主要是在声明变量的时候用,加上extern关键字,就说明这个变量可以被其它模块访问,比如头文件A.h中声明一个变量为extern int a;在源文件A.cpp中有一个全局变量为int a;而在源文件B.cpp中需要访问A.cpp源文件中的全局变量a,就需要包含头文件A.h,然后就可以在连接的时候找到A.cpp生成的目标文件A.obj中的符号a。
extern “C”(注意,这个C一定要大写)关键字主要是为了实现c++和c语言所写的不同模块间的互相调用而设计的。c++作为c的超集,支持了函数重载,重载的函数可以通过形参的类型进行区别,调用的时候会根据实参的类型自动匹配调用,其内部实现的原理大概是这样的。
比如有两个函数int add(int a, int b)和double add(double a, double b),它们是重载函数,在编译的时候c++编译器就会生成不同的函数名,对应它们的分别为
_add_int_int(int a, int b) 和 _add_double_double(double a, double b),所以重载后的函数还是可以区分的,而c语言是不支持重载的,所以在c中 int add(int a, int b)生成的函数名还是_add,如果一个模块是用c++语言写的,另一个模块是c语言写的,在函数调用的时候,由于在.obj文件中生成的函数名机制不一样,就会出现调用出错的情况。extern “C”就是为了解决这个问题而设计的。
我们通过例子来进行讲解,分为两种情况: