如何有效解決C與C 的相互呼叫問題

2021-06-01 06:09:50 字數 2129 閱讀 8292

前段時間做mobile開發,要進行c、c++混合開發,在進行c呼叫c++的時候,需要先將c++中呼叫物件導向特性的函式包裝一下,再用c來進行呼叫, 這樣才可以,具體如下:

在實際工作中可能經常要進行c和c++的混合程式設計,c++呼叫c語言的**通常都比較容易,但也有一些細節需要注意。c要呼叫c++的**就略為麻煩一些,因為c不支援物件導向的特徵。

首先我們來看一下c++呼叫c語言的**。要讓你的c**既能被c**又能被c++呼叫雖說容易,但是還是有需要注意的地方。現有三個檔案分別如下:

#ifndef testc_h

#define testc_h

#ifdef __cplusplus

extern "c"

#endif

#endif

#include "testc.h"

int add(int a, int b)

#include "stdio.h"

#include "testc.h"

int main()

說明:file testc.h是c的標頭檔案,file testc.c是其實現檔案,file testcpp.cpp是呼叫c函式的c++檔案。

檔案testc.h中的testc_h定義是為了標頭檔案保護,」 #ifdef __cplusplus」這個不能缺少,你可以去檢視c的標準庫標頭檔案中都有這個,如」stdio.h」。有了這個巨集編譯器就知道現在是c還是c++在呼叫它。

為什麼要區分c與c++呼叫呢?其深層次原因是因為c和c++編譯器在編譯和鏈結時對於函式的處理不一樣。c++為了支援函式過載在編譯時會加入函式引數及型別資訊。如上面的add方法,c編譯器編譯後在符號庫中的名字為_add,而c++編譯器則會產生像_add_int_int之類的名字。c++正是依靠這種機制實現了函式的過載。

extern關鍵字表示將函式或變數宣告為全域性型別,與之相對應的是static。static限定函式或變數的作用域為本檔案。extern還有乙個作用就是與」c」連在一起使用,即extern 「c」通知編譯器將extern 「c」所包含的**按照c的方式編譯和鏈結。

下面我們就來看看如何在c語言中使用c++的**(包括c++類的方法)。為了簡單起見,我將類的定義和實現放在乙個檔案中(通常應該是將分別放在.h和.cpp檔案中)。自定義類檔案(這裡省略了標頭檔案保護等其它細節)如下:

/class hjh

};將c++類封裝為c函式的檔案(為了簡略也將宣告和實現放在了同乙個檔案中)如下:

#include "testclass.h"

extern "c" int add_cpp(int a, int b);

int add_cpp(int a, int b)

實際呼叫c++**的c檔案如下:

#include "stdio.h"

extern int add_cpp(int a, int b);

int main()

上面的過程很清晰,就是用乙個函式將c++類的使用封裝起來,然後將它外部宣告為c函式就可以了。

檔案testclass.h定義並實現了乙個類,該類只有乙個add方法。檔案testcpp.cpp定義並實現了乙個函式add_cpp,函式中定義了乙個hjh類物件並呼叫了該物件的add方法。然後將add_cpp函式進行外部宣告為c。

testc.c檔案中為了使用add_cpp函式,也需要進行外部宣告。這是為了通知編譯器說明這個函式是在其他檔案中實現(注意在c檔案中的extern後面不可加」c」)。當這三個檔案一起編譯鏈結時,編譯器就可以找到add_cpp的具體實現。

以上**均在visual c++6.0環境下和vs2005環境下編譯通過並執行。

碰到乙個問題,在mfc的類中呼叫自己寫的c函式,出現錯誤說無法找到函式的定義,原來是由於c 和c++對函式的命名方式不同,c++的函式命名中還包括了各引數型別,因此通常情況下,c++程式無法找到c庫中的函式,需要在宣告c函式時加上 extern "c"的說明:

extern "c" void foo();c++編譯器就會用c的命名方式來進行連線。同樣,當c需要呼叫c++函式時,該c++函式也必須宣告為extern "c"。通常可以在c的標頭檔案裡這樣定義:

#ifdef __cplusplus extern "c"  #endif就可相容c和c++程式。看來c的好多東西還沒有掌握,尤其是跟編譯器相關的部分,需要全面的補一下課。平時遇到不清楚的問題一定要當時就搞明白,不能放過。

C和C 如何相互呼叫

為什麼不能直接呼叫 在編譯的時候c和c 生成符號的規則不同,所以直接呼叫會出現符號未定義的鏈結錯誤。示例1 下面演示相互呼叫介面錯誤示例 test.c int sum int a,int b main.cpp int sum int a,int b 在本檔案中宣告一下 int main 錯誤 1 e...

C與C 之間相互呼叫

c與c 之間相互呼叫 1 匯出c函式以用於c或c 的專案 如果使用c語言編寫的dll,希望從中匯出函式給c或c 的模組訪問,則應使用 cplusplus 預處理器巨集確定正在編譯的語言。如果是從c 語言模組使用,則用c鏈結宣告這些函式。如果使用此技術並為dll提供標頭檔案,則這些函式可以原封不動地由...

C與C 之間相互呼叫

1 匯出c函式以用於c或c 的專案 如果使用c語言編寫的dll,希望從中匯出函式給c或c 的模組訪問,則應使用 cplusplus 預處理器巨集確定正在編譯的語言。如果是從c 語言模組使用,則用c鏈結宣告這些函式。如果使用此技術並為dll提供標頭檔案,則這些函式可以原封不動地由c和c 模組使用。以下...