2016-04-18 11 views
1

C++プロジェクトがあるとします。 C++プロジェクトのCファイルで定義されている関数をextern "C"というキーワードで使うことができます。例:CファイルでC++メソッドを定義できますか?

Cコード:cfile.c

#include <stdio.h> 

void f(void) 
{ 
    printf("\n This is a C code\n"); 
} 

CPPコード:cppfile.cpp

ので
#include <iostream> 

extern "C" { 
void f(); 
} 

int main(void) 
{ 
    f(); 
    return 0; 
} 

、我々は行うことができます逆の場合のために:

Cppコード:cppCode.cpp

struct MyClass 
{ 
    virtual void f(const char* text); 
    void func(const char* text); 
}; 

我々はf方法や(例えば:cCode.c)Cファイル内func方法実装することができますを???それは可能ですか? (私の個人的な目的のための質問

+2

いいえ、クラスメンバ関数は常にC++言語のリンケージを持っているため、C言語の翻訳単位でエクスポートされた関数には一致しません。 –

+0

@KerrekSBオプションで編集できませんか? –

+1

@GillBates、いいえ、呼び出し規約が異なるため不可能です。 Cコンパイラはクラスメソッドに対する適切な呼び出しを生成できません。 – SergeyA

答えて

4

これは直接行うことはできません。しかし、(一種の)回避策があります。クラスのオブジェクトへのポインタを返す "C"リンケージを持つ関数を持つことができます - おそらく動的に割り当てられます - void*に変換されます。

クラス内の関数にマップする関数を実装することはできますが、上記の作成関数の呼び出しで取得されるアドレスであるvoid*という追加の引数を1つ取ります。単にvoid*をクラスの型に変換し、それをメンバと呼びます。

最後に、ポインタを中立的に削除するdispose関数が必要です。

+0

、SergeyAの詳細な例を教えてください。ありがとう –

関連する問題