0

ソース ファイルに 2 つの構造体があるとします。

struct B {
    int x;
};

struct A {
    beta y;
}; 

同等のヘッダー ファイルには、次のものがあります。

typedef B* beta;
typedef A* alpha;

また、これらの関数プロトタイプはヘッダー ファイルで定義されます。

printAplha(alpha);
compare(const beta, const beta);

メイン ファイルには、特定のヘッダー ファイルが含まれており、コードは次のようになります。

alpha one, two;
printAlpha(one);
printAlpha(two);
//everything works fine up to here
compare(one->y, two->y);

私が取得しているコードの最後の行で

main.c:37:20: エラー: 不完全な型へのポインターを逆参照しています
main.c:37:33: エラー: 不完全な型へのポインターを逆参照しています

compareの引数は型になります(比較関数の引数は変更できないため、再帰的なものです)のラッパー関数を使用できることはわかっていますalphaが、他の解決策があるかどうかを確認したいと思います。なぜこうなった。

注: 不透明 (OPAQUE) 型を作成するために、構造体定義がソース ファイルに書き込まれています。

4

2 に答える 2

1

struct Aタイプ定義を使用して不透明なデータ型を宣言しようとしてstruct Bいますが、同時に、そのような不透明な型を使用してフィールドにアクセスしようとしています。

上記のいずれかのみを実行できます。両方を同時に実行することはできません。

解決策は、完全な構造体定義を公開するか、特定のフィールドへのアクセスに役立つヘルパー メソッドを提供することです。ヘルパー メソッドの実装でも、完全な構造定義にアクセスできる必要があります。

于 2013-03-22T01:58:51.040 に答える
1

あなたがしていることには確かに「暗号化」は行われていませんが、サンプルコードがそれらの構造の実装を見ることが不可能になっています。構造体のフィールドにアクセスする場合は、完全な構造体の定義をその翻訳単位で認識できるようにする必要があります。それ以外の場合は、エラー メッセージが示すように、不完全な型です。

于 2013-03-22T01:36:51.693 に答える