5

C++内部にメソッドを持つ構造体があります:

struct S
{
   int a;
   int b;

   void foo(void)
   {
       ... 
   };
}

で書かれたユーザープログラムがありますC。構造体へのポインターを取得してS、メンバーaとにアクセスすることは可能bですか?

4

3 に答える 3

8

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 を構造体に追加するとすぐに、互換性がなくなり、他の手法を使用する必要があります。

于 2012-10-21T17:42:01.930 に答える
3

これらのメソッドが仮想でない場合は問題ありません。__cplusplus マクロを使用して、C/C++ の共通ヘッダーを使用することもできます。

struct S
{
   int a;
   int b;

#ifdef __cplusplus
   void foo(void)
   {
       ... 
   }
#endif /* end section for C++ only */
};

C でのこの構造体の名前はstruct S単なるS.

于 2012-10-21T17:44:13.407 に答える
2

プログラムが 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 から呼び出すことができます。

于 2012-10-21T17:42:10.863 に答える