C++
内部にメソッドを持つ構造体があります:
struct S
{
int a;
int b;
void foo(void)
{
...
};
}
で書かれたユーザープログラムがありますC
。構造体へのポインターを取得してS
、メンバーa
とにアクセスすることは可能b
ですか?
struct
構造体構文への C++ の追加が削除されていることを確認すると、C プログラムから C++ で記述されたa のメンバーにアクセスできます。
// header
struct S {
int a, b;
#ifdef __cplusplus
void foo();
#endif
};
// c-file:
#include "header.h"
void something(struct S* s)
{
printf("%d, %d", s->a, s->b);
}
C++ の構造体とクラスのメモリ レイアウトは、言語の C 部分について C と互換性があります。(仮想関数を追加することによって) vtable を構造体に追加するとすぐに、互換性がなくなり、他の手法を使用する必要があります。
これらのメソッドが仮想でない場合は問題ありません。__cplusplus マクロを使用して、C/C++ の共通ヘッダーを使用することもできます。
struct S
{
int a;
int b;
#ifdef __cplusplus
void foo(void)
{
...
}
#endif /* end section for C++ only */
};
C でのこの構造体の名前はstruct S
単なるS
.
プログラムが C で書かれている場合、どのように S を取得しますか? 私の推測では、最も正確な説明は、プログラムが C と C++ の混合で記述されており、C 部分で C++ 構造体のいくつかのメンバーにアクセスしたいということです。
解決策 1: C と C++ の共通サブセットになるように C 部分を変更し、結果を C++ としてコンパイルすると、必要な C++ 機能を徐々に使用できるようになります。それは、過去に多くのプロジェクトが行ったことです。最もよく知られている最近のものは GCC です。
解決策 2: extern "C" インターフェイスを S に提供し、それを C 部分で使用します。
#ifdef __cplusplus
extern "C" {
#endif
struct S;
int getA(S*);
int getB(S*);
#ifdef __cplusplus
}
#endif
getA と getB の実装を提供する部分は、C++ としてコンパイルする必要がありますが、C から呼び出すことができます。