2

このプロジェクトでは、C ファイル内からヘッダー ファイル内の構造体のサイズを取得する必要があります。

構造体には C でコンパイルされないクラスが含まれているため、C ファイルにヘッダー ファイルを含めることはできません。

何か案は?

4

3 に答える 3

5

C++ でユーティリティ関数を提供します。

extern "C" size_t ReturnSizeOfMyStruct(void) {
 return sizeof(MyStruct);
}

次に、C コードで呼び出します。

extern size_t ReturnSizeOfMyStruct(void);
size_t howBig = ReturnSizeOfMyStruct();
于 2013-02-27T21:02:15.230 に答える
5

.hファイルで次のように宣言できます。

extern const size_t SIZE_OF_MY_STRUCT;

そして、ファイルで次のように定義SIZE_OF_MY_STRUCTします。.cpp

extern const size_t SIZE_OF_MY_STRUCT = sizeof(MyStruct);

したがって、関数呼び出しのオーバーヘッドはありません。

于 2013-02-27T21:19:21.480 に答える
1

実際にstructC++ 機能 (メンバー関数、private/ protected/publicメンバー、コンストラクターおよび/またはデストラクタ、別のクラス/構造体から継承) を使用している場合 [または、これらの機能のいずれかを使用するメンバーを持っている場合]、多くの選択肢はありません。 :

  1. サイズを返す関数を作成します。これは C++ としてコンパイルされますが、extern "C"呼び出し規約が適用されます。
  2. 他の方法で C コードに sizeof(C++ struct) が必要ないように、コードを再編成します。
  3. C++ と互換性があるように C コードを変更し、C++ コンパイラでコンパイルします。

上記のテーマには他にもいくつかのバリエーションがあるかもしれませんが、基本的に、それが C でコンパイルできない「C++ 構造体」であると仮定すると、C++ に適した方法で修正することになります。

明らかに、C++ 構造体が C++ 機能を使用していない場合 (それは単純な古いデータである場合)、解決策は、構造体を現在のヘッダーから移動し、C と C++ の両方に含めることができるヘッダーに配置することです。 .

于 2013-02-27T21:05:28.823 に答える