如何實現c和c++函式互相呼叫《轉》____by張偉
〈一〉如何實現c中呼叫c++
鏈結庫標頭檔案:
class a
;.cpp
#include
#include "head.h"
a::a(){}
a::~a(){}
int a::gt()
int a::pt() }
編譯命令:
gcc -shared -o sec.so secso.cpp -l. -lmy
這時候生成第二個.so檔案,此時庫從乙個類變成了乙個c的介面.
拷貝到/usr/lib
下面開始呼叫:
#include "stdio.h"
#include "dlfcn.h"
關於這個文章的一點補充,轉至
二〉c++程式如何呼叫c語言寫的庫,如a.lib等,有對應的庫標頭檔案a.h。假設a.h中定義了函式:
int whycoding(int a, float b);
做法是,
/* cpp_a.h */
extern "c" {
#include "a.h"
或 /* cpp_a.h */
extern "c" {
int whycoding(int a, float b); /* 重定義所有的c函式 */
從上面可以看出,extern "c" 是用在c和c++之間的橋梁。之所以需要這個橋梁是因為c編譯器編譯函式時不帶函式的型別資訊,只包含函式符號名字,如c編譯器把函式int a(float x)編譯成類似_a這樣的符號,c聯結器只要找到了呼叫函式的符號,就可以連線成功,它假設引數型別資訊是正確的,這是c編譯聯結器的缺點。而c++編譯器為了實現函式過載,編譯時會帶上函式的型別資訊,如他把上面的a函式可能編譯成_a_float這樣的符號為了實現過載,注意它還是沒有帶返回值得資訊,這也是為什麼c++不支援採用函式返回值來區別函式過載的原因之一,當然,函式的使用者對函式返回值的處理方式(如忽略)也是重要原因。
基於以上,c呼叫c++,首先需要用封裝函式把對c++的類等的呼叫封裝成c函式以便c呼叫,於是extern "c" 的作用是:讓編譯器知道這件事,然後以c語言的方式編譯和連線封裝函式.(通常是把封裝函式用c++編譯器按c++方式編譯,用了extern "c" 後,編譯器便依c的方式編譯封裝介面,當然介面函式裡面的c++語法還是按c++方式編譯;對於c語言部分--呼叫者,還是按c語言編譯;分別對c++介面部分和c部分編譯後,再連線就可以實現c呼叫c++了).
相反,c++呼叫c函式,extern "c" 的作用是:讓c++聯結器找呼叫函式的符號時採用c的方式,即使用_a而不是_a_float來找呼叫函式。
如何在C 中呼叫C程式
c 和c是兩種完全不同的編譯鏈結處理方式,如果直接在c 裡面呼叫c函式,會找不到函式體,報鏈結錯誤。要解決這個問題,就要在 c 檔案裡面顯示宣告一下哪些函式是c寫的,要用c的方式來處理。1.引用標頭檔案前需要加上 extern c 如果引用多個,那麼就如下所示 extern c 然後在呼叫這些函式之...
如何在C 中呼叫C程式?
c 和c是兩種完全不同的編譯鏈結處理方式,如果直接在c 裡面呼叫c函式,會找不到函式體,報鏈結錯誤。要解決這個問題,就要在 c 檔案裡面顯示宣告一下哪些函式是c寫的,要用c的方式來處理。1.引用標頭檔案前需要加上 extern c 如果引用多個,那麼就如下所示 extern c 然後在呼叫這些函式之...
如何在C 中呼叫C程式?
c 和c是兩種完全不同的編譯鏈結處理方式,如果直接在c 裡面呼叫c函式,會找不到函式體,報鏈結錯誤。要解決這個問題,就要在 c 檔案裡面顯示宣告一下哪些函式是c寫的,要用c的方式來處理。1.引用標頭檔案前需要加上 extern c 如果引用多個,那麼就如下所示 extern c 然後在呼叫這些函式之...