2010-08-27 107 views
14

我們如何調用「C」代碼「C++」類的成員函數功能?調用「C++」類成員從「C」代碼

我有兩個文件的.cpp,在我所定義的一些類與

已經包括了一些其他幫助的CPP/h的文件,成員函數和相應的「 .h」頭文件。現在,我想打電話的CPP文件中的這些功能中的「C」文件。 我該怎麼辦呢?

回答

34

C沒有thiscall概念C調用約定不允許直接調用C++ o對象成員函數。

因此,您需要提供圍繞您的C++對象的包裝API,它明確地取代this指針,而不是隱式地取代。

例子:

// C.hpp 
// uses C++ calling convention 
class C { 
public: 
    bool foo(int arg); 
}; 

C包裝API:

// api.h 
// uses C calling convention 
#ifdef __cplusplus 
extern "C" { 
#endif 

void* C_Create(); 
void C_Destroy(void* thisC); 
bool C_foo(void* thisC, int arg); 

#ifdef __cplusplus 
} 
#endif 

你的API將會用C++實現:

#include "api.h" 
#include "C.hpp" 

void* C_Create() { return new C(); } 
void C_Destroy(void* thisC) { 
    delete static_cast<C*>(thisC); 
} 
bool C_foo(void* thisC, int arg) { 
    return static_cast<C*>(thisC)->foo(arg); 
} 

有很多偉大的文檔,在那裏,太。第一個I bumped into可以找到here

+0

謝謝xtofl, 連我在想,我們需要寫的包裝功能,但是我有些疑惑: 1.我們如何處理,如果類是由別的類繼承,我們需要對包裝父類功能也。 2.或者我們需要編寫包裝函數,我們只需要在「C」文件中調用.... – Priyanshu 2010-08-27 10:57:40

+0

@Priyanshu:一個有趣的轉折。 C不知道虛擬函數,但你的API代碼確實如此。所以如果'D'會覆蓋(虛擬)'foo'函數,那麼您需要額外的就是在您的API中使用'D_Create'。就像工廠模式,我會說。 但也許你需要提供更多的具體信息。 – xtofl 2010-08-27 11:05:06

+0

謝謝xtofl, 還有一件事,你已經給出了上面的例子.... class C { public: bool foo(int arg); }; 如果我們有這樣的事 C類{ 市民: 布爾FOO(INT ARG,X * X); private: X * x; } }; 那麼我們該如何編寫包裝器......這是可能的:-( – Priyanshu 2010-08-27 11:12:13