2010-02-15 76 views
3

我需要建立一個C++項目,出口功能到c項目 這是我的C++類:問題混合C和C++

** ** MyCppClass.h

class MyCppClass 
{ 
public: 
static void MyCppMethod() 
} 

** MyCppClass。 cpp **

void MyCppClass::MyCppMethod(){} 

*現在我需要爲Method MyCppMethod(static)創建一個接口。

我這樣做: ** ** MyExport.h

#define Export __declspec(dllexport) 
extern "C" void Export MyCppMethodWrapper(); 

** ** MtExport.cpp

#include "MyCppClass.h" 
#include "MyExport.h" 

void MyCppMethodWrapper() { MyCppClass::MyCppMethod();} 

完蛋了!

現在的C部分,(不同的項目) 我的鏈接項目與MyExport.lib
** ** program.c

#include "MyExport.h"  ->does not compile because of the extern "C" 
int main() 
{ 
    MyCppMethodWrapper(); 

} 

如果我不添加一行:在program.c #include "MyExport.h"該程序編譯和工作正常,但我需要爲導出提供一個頭(客戶端需要頭),我想使程序使用該頭。我該如何解決?

感謝您的回答

+1

你的代碼格式很好,這不是你的第一個問題。請在編輯器正上方點擊格式化按鈕,瞭解它是如何完成的。 – 2010-02-15 09:51:05

+0

什麼是編譯錯誤?我假設你正在使用windows – iain 2010-02-15 09:54:05

+0

順便說一下,MyCppMethodWrapper應該也可以'try/catch(...)'。您不希望將一個異常轉化爲C代碼。 – 2010-02-15 11:42:37

回答

5

您可以輕鬆地有條件地定義的extern如果這是你想要做的是這樣的:

#ifdef __cplusplus 
#define EXTERN_C extern "C" 
#else 
#define EXTERN_C 
#endif 

然後:

EXTERN_C Export MyCppMethodWrapper(); 
+0

解決它!!!!! thngs – Liran 2010-02-15 11:39:47

1

通常你」 d反過來,在C++程序中調用C函數,這是extern "C"的好處。在這種情況下它不會幫助你。

你也許可以做的是在dll中找到你的靜態方法的名稱,在C代碼中寫入一些extern ...語句,然後調用靜態方法。

請注意,C++程序中的名稱已被破壞,即對象文件/庫中的名稱包含有關方法所屬類的信息及其參數的類型。有一些工具可以在Linux世界中取消名稱的縮寫,但我不知道MS Windows世界中有什麼可用的東西,大概是某種東西。

我的一般建議是再次考慮是否必須這樣做。

+0

extern「C」在這種情況下是完全合法的,並且是與C共享C++代碼的方式。extern「C」告訴編譯器不要破壞名稱,只要包含聲明中的extern「C」在定義之前,函數是一個有效的非加速C函數。這種方法一直用於整合C和C++,並將C代碼遷移到C++。 – iain 2010-02-15 10:04:34

1

簡短的回答是:你可以從C++使用C,但不能用其他方法!

如果你想使用C C++,你需要創建一個瘦包裝,用純C函數(即extern "C" { ... }使用僅當編譯C++(因爲這種說法,很明顯,在C無效)並從C中使用函數。這應該是這個樣子:

#ifdef __cplusplus // defined at least by G++, I don't know for other compilers 
extern "C" { 
#endif 

// ... function definitions here 
#ifdef __cplusplus 
} 
#endif 
0

除了智囊團的答案,你需要的,如果你想使用你需要使用一個智囊團的答案相同的頭在program.c

/* declare function directly */ 
extern "C" void __declspec(dllimport) MyCppMethodWrapper(); 

int main() 
{ 
    MyCppMethodWrapper(); 

} 

使用dllimport的和爲__declspec(dllexport)

#ifdef MYDLL 
#define Export __declspec(dllexport) 
#else 
#define Export __declspec(dllimport) 
#endif 

EXTERN_C void Export MyCppMethodWrapper(); 

額外#ifdef然後添加一個/ d MYDLL到您的DLL項目的構建標誌。

+0

這是一個視覺工作室只回答...無關,與C/C++ ... – PierreBdR 2010-02-15 10:03:02

+0

「以及智囊團的答案,你需要在program.c使用dllimport的」,你的答案是基本相同的智囊團的。正如我在答覆中所說,一旦Liran完成了這個工作,他將不得不修復他的dll導入/導出聲明。我正在更新我的答案,使其更清晰。 (視覺工作室的細節已經在問題中了) – iain 2010-02-15 11:08:59