2016-10-24 4 views
0

構造体を定義する際に構造体を使用できますが、関数や構造体を宣言する方法はどうしたらよいですか?extern構造体を宣言する方法は?

TEST.H

extern struct foo; 
typedef int (*test)(FOO *f); 
typedef struct foo 
{ 
char a; 
test *t; 
} FOO; 

int haha(FOO *f) { return 0;} 

typedef struct foo 
{ 
char a; 
test *t; 
} FOO; 

test.cの

​​
+0

ポインタの問題と同様に、特に「extern」について質問しました。 extern構造体が意味することは何ですか?達成するために何を望んでいますか?このコンパイルユニットは、構造体の内容を使用する必要がある場合は完全な定義が必要です。あなたは構造体のexternインスタンスを意味しましたか?私の構造体の – Rup

+0

私は関数または構造体fooへのポインタが必要です。 functionまたはstruct fooには、パラメータまたはメンバprev構造体があります。問題は構造依存を一緒に宣言することです。変数ではありません。 –

+0

OK、以下の答えはあなたが望むものだと思います:メンバーを組み込み構造体ではなくポインタ型構造体として宣言する必要があります。関数ポインタは正常に動作するはずです。 – Rup

答えて

3

問題は、あなたが持っていない限り、あなたが構造体変数(または他の構造内側部材)を定義することができないということです実際の構造の完全な定義。前方宣言は完全な定義ではありません。前方宣言がある場合、宣言できるのは構造体へのポインタです。あなたが行うことができ、すべての構造体へのポインタを宣言するので、これは動作します

typedef struct bar BAR; // Forward declaration of the structure and type-alias definition in one line 
typedef struct foo FOO; // Forward declaration of the structure and type-alias definition in one line 

struct foo { 
    char a; 
    BAR *b; // Define a *pointer* to the BAR structure 
    FOO *s; // Define a *pointer* to the FOO structure 
}; 

のようなもので、コンパイラは唯一、それは完全な構造を必要としない、構造が存在することを知っている必要があります意味

定義。このために、通常の前方宣言だけで十分です。

構造を再帰的に参照するときにも、完全な定義が閉じ中括弧まで完全ではないため、ポインタも必要であることにも注意してください。

+0

struct ** bar **が依存するため、このコードをコンパイルしないでください。** foo ** –

+1

@MarkoLustroこれは正常に動作します。 *ポインタ*を定義するには、次のように前方宣言が必要です。 –

+0

@MarkoLustroまた、 'struct bar'の中の' struct foo'をポインタにしたいと思うかもしれませんが、もしあなたがそうでなかったとしても、既存の定義は上記の置換fooの定義でコンパイルすべきです。その時点でのfooのサイズ。 – Rup

関連する問題