0

背景: C プログラムの機能を拡張する動的ライブラリを C++ で実装しています。C プログラムで使用される主要な構造体の 1 つに、独自のライブラリ固有のフィールドを追加したいと考えています。現在、新しいフィールドが必要なときは、C プログラムの開発者にフィールドを追加してほしいと頼んでいます。代わりに次のことができるかどうか疑問に思っていました。

メインプログラムのヘッダファイル:

#ifdef __cplusplus
extern "C" {
#endif
/* ... */
typedef struct ImportantStruct {
/* Definitions */
} ImportantStruct
/* ... */
#ifdef __cplusplus
}
#endif

ヘッダー ファイル:

//...
class ObjectType : public ImportantStruct {
// Our extra fields
}
//...

私は2つの質問があると思います:

1) これも合法ですか?

2) C プログラムがオブジェクトの構造体部分を使用しようとすると、どのような問題が発生しますか?

4

2 に答える 2

1

は POD 構造であるためImportantStruct(自動的に標準レイアウトを持ちます)、ObjectType には他の基本型がなく、仮想メソッドがない場合は標準レイアウトも持ちます。したがって、C では構造体として使用できます。

1) これも合法ですか?

はい、そうです。

2) C プログラムがオブジェクトの構造体部分を使用しようとすると、どのような問題が発生しますか?

あなたの c 関数がそれを上書きしようとしないなら、あなたは安全です。次のように上書きできます:

void foo( struct ImportantStruct *s )
{
 memset( s,0, sizeof(*s) );
}

存在する場合は、ImportantStruct の内容と、パディングされたバイトがあるかどうかによって異なります。

このような構造:

typedef struct {
  int a;
  char b;
} ImportantStruct;

基本クラスを作成したときに、パディングされたバイトが削除された可能性があります。

とにかく、私は構成を使用し、あらゆる種類の問題を回避します。ただし、それが最初のメンバーであること、および ObjectType が標準レイアウトであることを確認する必要があります。

于 2012-11-08T19:05:35.047 に答える
0

派生したアプローチは機能するはずですが、結果として生じる配置に注意してください。「拡張された」PODで結果として生じるサイズ/オフセットについては仮定しません。一部のコンパイラは、基本クラスのパディングを削除する場合があります。したがって、派生したC ++ PODは、それぞれとはサイズが異なる場合があります。拡張フラットC構造体。

派生オブジェクトのレイアウトの詳細:c-data-alignment-member-order-inheritance

また、PODを拡張する目的で、structキーワードoverを使用できますclass。大きな違いはありません。デフォルトでは、構造体のメンバーだけが公開されています。また、PODの意図を表現することもできます(ただし、強制されません)。

于 2012-11-08T22:42:03.213 に答える