今週のC ANSI言語の特徴と大きな課題を学びます。ポインタ付きのtypedefの宣言
練習では、関数のシグネチャの宣言がいくつかあるヘッダーファイルがあります。
この1つは私の注意を引いた:
typedef struct image * Image;
私は私の.cファイルでこれを試してみました:だから
imagePGM.c:22:3: erreur: conflicting types for ‘Image’
} Image;
:
typedef struct {
char nbrMagique[10];
unsigned long imgLarg;
unsigned long imgHaut;
unsigned long imgSeuilMax;
unsigned long **imageMatrice;
} Image;
しかし、コンパイル時に常にエラーを持つ続けます私は.cファイルの構造体を再定義することはできないので、ヘッダーのいずれかに触れることはできないと思います。
"typedef struct image * Image;を尊重すること。 .hヘッダーファイルで、私は動的な2次元テーブルを作成し、それにポインタ*画像を向けなければなりませんか?
私の見解には何かが欠けていますか?
しかし、typdefのシグネチャ内のポインタ*は、.hファイルの中で何を意味していますか? typedef
のセマンティクスから
'Image'の二つの異なる定義をしました。一つは' struct image * 'のtypedefで、もう一つは無名structのtypedefです。一度名前をtypedefすることができます。たぶんあなたはあなたのcファイルに 'struct image {......};'を意味していたでしょう –
私はstruct image * Imageを使用しなければなりません。それは確かに 私は2番目を使用することはできません。 しかし、typderの署名にあるポインタ*はどういう意味ですか? – Cyberflow
これに関する情報を追加します。コンテキストは、不完全な型へのポインタを作成しようとしている可能性があります。これは_opaque pointers_と呼ばれることもあります。これはCで真のプライベートカプセル化を実現する方法です。そうであれば、それをポインタとしてtypedefしないほうが良いでしょう。 'typedef struct image image'を行い、呼び出し元にポインタ構文を使用させる方がよいでしょう。 – Lundin