次のコードを試しました:
File1.c:
int x;
File2.c:
extern char x;
main()
{
x=10;
....
....
}
としてコンパイルされます
$gcc File1.c File2.c
エラーは発生しませんでしたが、エラーが発生することを期待していました。
では、タイプFile.c
のコンパイラに約束します。すべての翻訳単位は個別にコンパイルされるため、コンパイラーはこれを検証する方法がなく、あなたの言葉を受け入れます。また、リンカーは型チェックを行いません。エラーなしでビルドされる無効なプログラムになってしまいます。x
char
これが、ヘッダー ファイルを使用する必要がある理由です。File1.c
とFile2.c
の両方が同じヘッダーから のextern
宣言を取得した場合x
、コンパイル時にエラーが発生しますFile1.c
(定義が宣言と一致しないため)。[帽子のヒント @SteveJessop]