ご提案いただいたレイアウトで問題ありません。おそらく、externと#includeが何をするかについての説明が役立つでしょう。1) #includeはプリプロセッサ ディレクティブであり、基本的に次のように述べています。
2) externは C の予約語です。あまり専門的なことには触れませんが、その意味は次のとおりです。「このステートメントで指定された変数は、別の場所で定義されています」。変数のスペースはコンパイラによって一度だけ予約されるため、関数が問題の変数にアクセスする必要がある場合、コンパイラが定義を確認する前にいくつかの情報が必要になります。extern宣言には、関数が変数を使用するのに十分な情報が含まれており、リンカーは後の段階で正しい変数が使用されることを確認します。
したがって、シナリオでは、型定義を含むファイルは、それらの型を参照するすべてのファイルで#includeされます。プロジェクトの他の部分とは別にコンパイルされる 1 つのファイルにすべての変数定義を収集する場合、それらの変数を使用し、個別にコンパイルされるファイルには、他の場所で定義された各変数のextern宣言を提供する必要があります。変数定義を含む th ファイルを単純にインクルードすると、コンパイラは定義を 2 回 (最初に定義を含むファイルで、次にそれを含むファイルで) 参照し、各変数を 2 回定義しようとしていると想定し、エラー。
最後に、簡単なシナリオを次に示します (実際には意味がなく、スタイルも良くありません)。
交流 - - - - -
#include "t.h"
mytype a;
mytype b;
int f( int x, int y ) {
return (x + y)*a - b;
}
mc---------
#include <stdio.h> // for stdout
#include "t.h"
#include "v.h"
int main () {
fprintf( stdout, "%d", a + b - f(1, 2) );
return 0;
}
目 -----------
typedef int mytype;
-----------
#include "t.h"
extern mytype a, b;
int f( int, int );
vh と th を組み合わせることができます (スタイルとプロジェクトの要件の問題です)。vh 内の f の宣言には、その前に暗黙の extern があることに注意してください。