1. 程式人生 > >C/C++之間的相互呼叫

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的命名規則去找