[英]calling C++ method from C code
我在這里閱讀了以下文章,解釋了如何從純C代碼調用基於c ++的函數。
下面的示例可以最好地說明該方法:
// C++ code:
class C {
// ...
virtual double f(int);
};
extern "C" double call_C_f(C* p, int i) // wrapper function
{
return p->f(i);
}
/* C code: */
double call_C_f(struct C* p, int i);
void ccc(struct C* p, int i)
{
double d = call_C_f(p,i);
/* ... */
}
但是,我不明白是否在哪里定義由“ p”指向的實例。 請注意,在C代碼中,它作為指向不透明結構的指針提供,在C ++代碼中,它被假定為指向class C
有效實例的指針,但是我沒有看到此指針的初始化位置。
ps當然,與不同語言相關的每個代碼塊都使用適當的編譯器進行編譯,並創建了不同的目標文件。
您需要類似的包裝器方法來創建和銷毀C ++對象。
C ++代碼:
extern "C" C * create_c()
{
return new C;
}
extern "C" void destroy_c(C *p)
{
delete p;
}
C代碼:
// forward declarations (better to put those in a header file)
struct C;
struct C * create_c();
double call_C_f(struct C* p, int i);
void destroy_c(struct C *p);
struct C * p = create_c();
double result = call_C_f(p, i);
destroy_c(p);
p = NULL;
在您的示例中, p
是類C
的對象。 您必須使用C ++代碼創建它,然后將其傳遞給C。
您還應該在C中將指向C ++類的指針聲明為void *
。類型是未知的,並且struct C
暗示它是已知的結構,這是錯誤的。
例:
extern "C" {
struct C;
struct C *create_c(void)
{
return new C;
}
void destroy_c(struct C *ptr)
{
delete ((C*)ptr);
}
}
您將使用C ++創建它,最有可能使用new C()
創建它。 沒有辦法在C中移植它,因此,如果C代碼必須能夠構造新的實例,則必須編寫一個extern "C" C* construct_C();
它的工廠功能; 同樣對於析構函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.