関数が次のように宣言されている特定のコード スニペットを確認していました。
int fn_xyz()
ただし、別の .c ファイルで関数を参照している間は、次のように定義されます。
extern void fn_xyz()
fn_xyz が呼び出されている間、戻り値のチェックはありません。GCC-4.7.0 は上記の不一致について警告しませんでした。これは期待されていますか?
関数が次のように宣言されている特定のコード スニペットを確認していました。
int fn_xyz()
ただし、別の .c ファイルで関数を参照している間は、次のように定義されます。
extern void fn_xyz()
fn_xyz が呼び出されている間、戻り値のチェックはありません。GCC-4.7.0 は上記の不一致について警告しませんでした。これは期待されていますか?
各ソース ファイル (技術的には各翻訳単位) は、他のファイルとは完全に独立してコンパイルされます。したがって、コンパイラは、複数の場所で同じシンボルを宣言したことを認識しません。リンク時にすべての型情報が削除されているため、リンカも文句を言うことはできません。
これがまさに、すべてのソース ファイルにインクルードするヘッダーで関数を宣言する必要がある理由です。そうすれば、型の不一致によってコンパイラの警告/エラーが発生します。
リンク段階はコンパイル後に行われるため (共有ライブラリへのリンクのように、コンパイラはリンク先を認識したり気にしたりしません)、そのようなテストがコンパイラに期待されないことは理にかなっています。