2016-04-18 33 views
6

Aşağıdaki C++ temelli işlevleri nasıl çağırılacağını açıklayan here numaralı makaleyi okudum.C kodundan C++ yöntemini çağırma

yöntem en iyi aşağıdaki örnek ile açıklanmıştır

:

// 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); 
    /* ... */ 
} 

Ancak, i p "ile işaret edilen bir örneği tanımlarım burada anlamak için başarısız . C kodunda, opak yapıya işaretçi olarak iletildiğini ve C++ kodunda, geçerli örnek class C olarak kabul edildiğini fark ettim, ancak bu işaretçinin başlatıldığını görmedim.

p.s. Elbette farklı bir dille ilgili her kod bloğu uygun bir derleyici ile derlenir ve farklı bir nesne dosyası oluşturulur.

cevap

6

oluşturabilir ve C++ nesnesi yok etmek için benzer bir sarma yöntemleri gerekir.

C++ kodu:

extern "C" C * create_c() 
{ 
    return new C; 
} 

extern "C" void destroy_c(C *p) 
{ 
    delete p; 
} 

C kodu:

// 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; 
+0

Bu yanıtın güzel bir eklentisi, C sınıfının sanal üye işlevine sahip olması nedeniyle [POD türleri] (http://en.cppreference.com/w/cpp/concept/PODType) hakkında bir paragraf olacaktır (opak bir yapının gerekliliğinin ardındaki asıl nedendir. –

+0

Yardım için teşekkürler. Ancak Kullanım bölümünde, aramadan önce işlev tanımına sahip olmamam gerekir. tanımı 'C * create_c()' türündendir ... ama C kısmı C sınıfını tanımıyor. – Zohar81

+2

@ Zohar81 sadece ekle 'struct C;' bildirmek için –

0

Büyük olasılıkla, new C() ile C++ 'da oluşturursunuz. C kodu içinde onu oluşturmanın bir yolu yoktur, bu yüzden C kodunun yeni örnekler oluşturabilmesi için, bunun için bir extern "C" C* construct_C(); fabrika işlevi yazmanız gerekir; Aynı şekilde bir yıkıcı için.

3

Örneğinizde, p, sınıfınızın bir nesnesi olan C. C++ kodunda bunu oluşturmanız ve bunu C'ye iletmeniz gerekir.

İşaretçileri de C++ sınıfınıza C olarak void * olarak bildirmeniz gerekir. Tür bilinmiyor ve struct C bilinen bir yapıyı ifade eder. Hata.

Örnek:

extern "C" { 
struct C; 
struct C *create_c(void) 
{ 
    return new C; 
} 

void destroy_c(struct C *ptr) 
{ 
    delete ((C*)ptr); 
} 
} 
+1

ileri nesi yanlış 'yapı C' ilan? –

+1

@BryanChen Çalışıyor, bu bir sorun değil. Sadece yanlış bir izlenim veriyor, aslında C kodundaki türü biliyorsunuz. Sen yapmıyorsun. Bu, bilmediğiniz bir opak tiptir, dolayısıyla semantik yanlıştır ve “void *”, doğru semantiğe sahiptir. – Leandros

+0

Aslında bir yapının kullanımını yararlı buluyorum. Tüm boşluk işaretçileri eşit olduğunda, farklı yapı işaretçileri değil. –

İlgili konular