複数のCファイルをプログラム内でコンパイルする

以下の2つのファイルがあります。

file1.c

int main(){
  foo();
  return 0;
}

file2.c

void foo(){

 }

2つのファイルを一緒にコンパイルしてリンクすれば、externを追加しなくても file1.cfoo 関数を認識するようになりますか?

プロトタイプを更新しました。

gcc file1.c file2.c throws: warning: implicit declaration of function foo.

正しい方法は以下の通りです。

file1.c

#include 
#include "file2.h"

int main(void){
    printf("%s:%s:%d \n", __FILE__, __FUNCTION__, __LINE__);
    foo();
    return 0;
}

file2.h

void foo(void);

file2.c

#include 
#include "file2.h"

void foo(void) {
    printf("%s:%s:%d \n", __FILE__, __func__, __LINE__);
    return;
}

output

$
$ gcc file1.c file2.c -o file -Wall
$
$ ./file 
file1.c:main:6 
file2.c:foo:6 
$ 
解説 (4)
ソリューション

externは必要ありませんが、file1.c にはfoo()` が存在することが宣言されていなければなりません。通常、この宣言はヘッダーファイルの中にあります。

ヘッダーファイルを使わずに前方宣言を追加するには、file1.c を次のように修正するだけです。

int foo();  // add this declaration

int main(){
  foo();
  return 0;
}
解説 (3)

できるけど、やってはいけない。

ヘッダーファイルfile2.hを使用します。

// file2.h

void foo(); // prototype for function foo()

そして、追加します。

#include "file2.h" 

in file1.c

コンパイルするには

$ gcc -Wall file1.c file2.c -o foo

一般的なルールとして、依存するモジュール内でアドホックなプロトタイプを使用するよりも、各モジュールのインターフェイスを定義するヘッダーファイルを使用する方が良い(より堅牢である)です。これは、SPOT (Single Point Of Truth) の原則と呼ばれることもあります。

解説 (12)