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