簡體   English   中英

從C代碼調用C ++方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM