2017-01-24 14 views
0

に私はコンパイルする必要があるときに問題が来る不明なタイプ名「リスト」Cプログラム

struct listnumbers { 
    float number; 
    struct listnumbers *next; 
};typedef struct listnumbers *list; 

のような構造体を入れた.c複数のファイルにプログラムを分割し、main.ciに を.Hする問題がありましたすべてのファイル.c .hとコンパイラは、sorting.h = void sorting(list * pt、float number)のUnknown type name "list"のようなエラーを表示します。

+2

[よくある質問を読む](http://stackoverflow.com/help/how-to-ask)、[最小限の完全で検証可能な例](http: //stackoverflow.com/help/mcve)。実際のエラーを完全かつ未編集で確認する必要があります。そして、最初にエラーの原因となった原因を調べる必要があります。 –

+1

関連のないメモでは、 'list'を*ポインタ*として定義してもよろしいですか?例えば ​​'sorting'関数を表示します。この関数は' list'へのポインタを最初の引数として取ります。つまり、ポインタへのポインタである 'struct listnumbers **'を意味します。それは意図されていますか?あなたのコードを読んでいる人達と一緒にいなければ、型をポインタとして定義することは、遅かれ早かれ混乱につながります。 –

+0

'struct listnumbers { 浮動小数点数; struct listnumbers * next; }; typedef構造体listnumbers *リスト; void sorting(list * pt、float number); int main() { } 'ここでうまくコンパイルされます。あなたの問題は 'list'は' sorting.h'で未知であるということです。 'sort.h'に含める必要がある' list.h'が必要になるでしょう。 –

答えて

0

構造体を.hファイルで定義する必要があります。構造体がどこで使われるかを含む。

不明なタイプ名「リスト」sorting.hlistを処理している間は不明であることを伝えるためにしようと sorting.hに。

typedef + structを組み合わせてist定義を短縮することもできます。

typedef struct listnumbers { 
    float number; 
    struct listnumbers *next; 
} *list; 
+0

typedef struct too? – zehunixed

+0

main.cのstructを削除し、.hファイルだけを置く必要がありますか?main.cに.hファイルを含めます。 – zehunixed

+0

はい、このようにコンパイラは 'list'を認識しません。 簡単に言えば、.cファイルの "what"と "how"を定義します。あなたの構造体を定義することは "何"の一部です –

4

Cでは大文字と小文字が区別されます。 Structstructである必要があります。 Cでの構造体と一緒に行くために

方法

  1. 構造体のためのtypedefを気にしないでください、彼らは無用であり、唯一の公共ヘッダファイルに構造体を宣言したstructキーワード
  2. を入力して、あなたを救うれます#includeは、structを必要とするファイルにのみ存在します。つまり、適切なインターフェイスを記述し、インターフェイス宣言をヘッダーに配置します。インターフェイスの実装はCファイルに入れます。
+1

...彼らは役に立たず、_struct_キーワードを入力するだけで済みます。だから、彼らは無駄ではありません。 –

+0

@TomasF。少数の文字を保存することは、保守性の喪失を考慮すると、役に立たない。私が 'struct mumble x'を見るとすぐに' .'を使わなければならないことをすぐに認識し、xのprintfフォーマットを見つけることはできません。 'mumble x'では目が見えません。人々は何をしていますか? 'typedef struct mumble mumble_s'の接尾辞に余分な文字を使います。それは、間違っている、狂っている。 Peter van der Lindenは、彼の本「Expert C Programming - Deep C Secrets *」でさらに詳しく説明します。 – Jens

+0

Jens(I.)たぶんあなたは、保守性の欠如を意味するものを説明することができます。元のキーワードを完全に置き換え、下の行を定義したエイリアスが何かを害する可能性があるという点を私は知りません。 (II。)私がC言語で 'mumble'のような予約されていない型の識別子を見たとき、structのキーワードに関係なく、structや何かを知っています。 (III。)そのようにする理由は何ですか? 'typedef struct uglyNam_e niceName'も使うことができます。 –

関連する問題