2011-12-09 10 views
1

構造体定義を持つ2つのファイルがあります。ヘッダー:他のソースファイルで定義されているexternのvarsとstruct

typedef struct _InputData InputData; 
extern InputData input_data; 

とソースファイルは:

struct _InputData{ 
    char const*modification_l; 
    char const*amount_l; 
    char const*units_l; 
}; 
InputData input_data = {...}; 

私は他のソースファイルからINPUT_DATA使用しようと、それは私の「不完全なtypedefの 『入力データ』の無効な使用」を与えます。なぜ私はそれが起こったのか理解していると思いますが、どうやって優雅なやり方で対処することができますか?

答えて

2

ヘッダファイルに完全構造を定義しています。さもなければ、それが持っているフィールド、つまり不完全なフィールドを知る方法がありません。

+0

またはそれ以上ヘッダーでのみ定義し、ヘッダーをソースファイルに含めます。 –

+0

@BlagovestBuyuklievああ、それは私が何を意味していたか...回答が更新されました。 –

0

structへのポインタを使用できますが、インスタンスではありません。コンパイラは構造体が何であるか、そのような変数のメモリオフセットを計算する方法を知らない。

なぜstructの定義をCファイルに入れますか?それをヘッダーに入れてください。

+0

私はしようとしましたが、 "参照が不完全な型への逆参照" – Yola

+0

@Yola、はい、逆参照時に構造体の定義が未知の場合 - コンパイラは引き続きオフセットの計算方法を知らないでしょう。あなたがしたことは、例えばC++クラスのプライベート型を宣言しているときに使用され、外部ユーザーがそのビルド方法を知り、それを指すようにしたくないときに使用されます。逆参照している場合は、**定義が含まれていなければなりません。 – littleadv

1

あなたは、このアプローチ(多かれ少なかれ)を行うことができますが、代わりにポインタとして構造体を定義する必要があります。

ヘッダ

extern struct InputData* input_data; 

ソースファイル:

struct InputData{ 
    char const*modification_l; 
    char const*amount_l; 
    char const*units_l; 
}; 

InputData* input_data; 
... 
input_data = malloc(sizeof(InputData)); 
関連する問題