以下の2つのファイルがあります。
file1.c
int main(){
foo();
return 0;
}
file2.c
void foo(){
}
2つのファイルを一緒にコンパイルしてリンクすれば、extern
を追加しなくても file1.c
が foo
関数を認識するようになりますか?
プロトタイプを更新しました。
gcc file1.c file2.c throws: warning: implicit declaration of function foo.
正しい方法は以下の通りです。
file1.c
#include <stdio.h>
#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 <stdio.h>
#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
$
externは必要ありませんが、file1.c には
foo()` が存在することが宣言されていなければなりません。通常、この宣言はヘッダーファイルの中にあります。
ヘッダーファイルを使わずに前方宣言を追加するには、file1.c を次のように修正するだけです。
int foo(); // add this declaration
int main(){
foo();
return 0;
}
できるけど、やってはいけない。
ヘッダーファイル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) の原則と呼ばれることもあります。