C/C++之间的相互调用

C调用C++意思是  .c文件中调用.cpp文件中的代码

C++调用C的意思是.cpp文件中调用.c文件中的代码

使用extern "C" 主要原因:主要用于在C++代码中调用的C函数的声明,或C++中编译的函数要在C中调用,也即是导入C形式的函数库或者提供C类型的库给C调用,因为在C++出现以前,很多代码都是C语言写的,而且很底层的库也是C语言写的,为了更好的支持原来的C代码和已经写好的C语言库,需要在C++中尽可能的支持C,而extern "C"就是其中的一个策略。

C编译器编译函数时不带参数的类型信息,只包含函数的符号名字。如int  func( int x )

  • C编译器会将此函数编译成类似_func的符号,C连接器只要找到了调用函数的符号,就认为连接成功。
  • 而C++编译器为了实现函数重载,会在编译时带上函数的参数信息。如它可以把上面的函数编译成类似于_func_int这样的符号。

extern"C"的使用:通过extern"C"可以实现混合编译,让编译器以C的语言规则来处理代码。

一、C++调用C   (.cpp文件中加extern "C")

        C++调用C,extern "C" 的作用是:让C++连接器找调用函数的符号时采用C的方式。

#include<stdio.h>
extern "C"
{
	void Show()//以_Show的符号查找连接
	{
		printf("show.c: void Show()\n");
	}
}
int main()
{
	Show();
	return 0;
}

二、C调用C++

        C调用C++,使用extern "C"则是告诉编译器依照C的方式来编译封装接口,当然接口函数里面的C++语法还是按C++方式编译   

  • 修改C++的文件   .cpp文件中加extern"C"(和C++调用C接口的处理方式相同,接口函数里的编译语法还是C++编译)
#include<stdio.h>
extern "C"
{
	void Show()//以_Show的符号查找连接,Show函数里的编译语法还是C++
	{
		printf("show.c: void Show()\n");
	}
}
int main()
{
	Show();
	return 0;
}
  • 不修改C++里的文件(加中间层处理),如下图:

如上图,建立中间层Middle来调用Show函数,使用时声明Middle,再调用Show。

三、编译器源文件不确定什么编译器编译:

时常在cpp的代码之中看到这样的代码: 特别是C ++中引入C的头文件,这些C头文件中出现很多如下代码。

#ifdef __cplusplus

extern "C"

{

    #endif

    //一段代码

    #ifdef __cplusplus

}

#endif  

例:

    #ifdef __cplusplus
   extern "C"
   {
   #endif
       void CShow()
       {
           printf("Show1.c : void CShow()");
       }
   #ifdef __cplusplus
   }
   #endif

 __cplusplus是C++编译器的保留宏定义.

所以关键还是extern "C" {}

extern "C"是告诉C++编译器件括号里的东西是按照C的obj文件格式编译的,要连接的话按照C的命名规则去找

     

猜你喜欢

转载自blog.csdn.net/FoXiShaoNv/article/details/84763074