C言語:extern

全ファイル中のどこかに定義してある、という意味です。複数ファイル構成で分割コンパイルする場合に必要で、一般的には共通ヘッダファイルに記述します。

ファイルが一つだけのプログラムでは、あまり使い道がありません。しかし厳密には、ファイルが一つでもライブラリ内の関数や変数を参照する場合にextern宣言が必要です。ライブラリはコンパイル済みCファイルの集合体だからです。
1. 関数のプロトタイプ宣言

関数のプロトタイプ宣言にexternを付ける付けないは、あまり問題になりません。

externは「全ファイル中のどれかに定義されている」ですから、 extern int func_A(int n); は、a.c でも、b.c でも同じように宣言できます。

staticではない関数は、ファイル外部から見えると解釈されるので、関数のexternは省略できます。

2. 変数

2.1 正しい使い方

まずは正しい使い方です。a.c 内で定義された int a; を b.c 内で使っています。

2.2 コンパイルエラー

この例では、a = 2; の a は、b.c内では定義されていないよ!とコンパイルエラーになります。

2.3 リンクエラー(1)

コンパイルはOKです。しかしリンクで、変数 a が、a.cとb.cの2箇所で定義されています?とリンクエラーになります。一つのプログラム内では、同じ名前のグローバル変数は複数使えません。(グローバル変数とは、関数の外で定義した変数)

似たような例を紹介しますが、一つの関数内では、同じ名前のローカル変数を複数使えません。(ローカル変数とは、関数の中で定義した変数)

2.4 リンクエラー(2)

b.c のコンパイルはOKです。b.cの変数aの扱いは「別ファイルにあるはず」と、変数aに関する問題を先送りにします。しかしリンクのとき、全ファイルを見渡しても変数a はどこにもない、とリンクエラーになります。

(2000年頃の記事)