(私は C について話していますが、C++ のクラス テンプレートにも当てはまります)
ヘッダーファイルには、定義ではなく、すべての宣言を入れるのが習慣です。ただし、通常、構造定義やクラス テンプレートもヘッダー ファイルに配置しますが、その理由を実際に理解することはありません。これらは定義でもあるため、これは実際には意味がありません-1つの定義ルール。(はい、構造定義とクラス テンプレートによってストレージが設定されることはありませんが、定義であることを意味する以下の「再定義」エラーが引き続き発生します)。
例) 同じファイル内で同じタグを持つ複数の構造体を定義すると再定義エラーが発生しますが、複数のソース ファイルで同じタグを持つ複数の構造体を定義してもエラーは発生しません (クラスでも同じことが起こります)。
意味のある唯一のことは、構造定義とクラス テンプレートに内部リンケージ (デフォルトの外部リンケージとは対照的) があることですが、K&R またはリファレンス マニュアルでそれに関する参照を見つけることができません。実際、構造はリンケージでも言及されていません。
ANSI標準がこの現象を指摘している正確な参照を知りたいです。(IMO、これは ANSI 標準のどこかで言及されなければならないかなりあいまいなものです)。
編集 構造定義をヘッダーファイルに入れることができる理由を尋ねているわけではありません。
構造体定義をヘッダー ファイルに配置しても、変数定義をヘッダー ファイルに配置した場合 (およびそれを複数のソース ファイルにインクルードした場合) のように、再定義エラーが発生しない理由を尋ねています。
例) test1.c: int a = 3; test2.c: int a = 4; 再定義によりコンパイルエラーとなります。でも、
test1.c: struct test { int a }; test2.c: struct test { int b }; コンパイルエラーは発生しません。私が思いつく唯一の理由は、構造定義に内部リンケージがあるか、リンケージがまったくないことです。