C 言語では、修飾子 extern は変数または関数の宣言の前に使用され、「この変数/関数は別の場所で定義されているため、ここで参照する必要があります」ことを示します。
1. Extern は変数の宣言を変更します。たとえば、ファイル a.c が b.c の変数 int v を参照する必要がある場合、a.c で extern int v を宣言すると、変数 v を参照できます。ここで注意する必要があるのは、参照される変数 v のリンク属性は外部リンク (external) でなければならないということです。つまり、a.c が v を参照するには、a.c の extern int v の宣言だけではなく、ただし、変数 v 自体にも依存します。これには、C 言語の別のトピックである変数のスコープが関係します。 extern 修飾子を使用して他のモジュールから参照できる変数は、通常、グローバル変数です。もう 1 つの非常に重要な点は、extern int v を a.c のどこにでも配置できることです。たとえば、a.c の関数 fun の定義の先頭で extern int v を宣言すると、変数 v を参照できます。これですべてです。 v は関数 fun のスコープ内でのみ参照できますが、これは依然として変数スコープの問題です。この点に関しては、利用する際に不安を感じる人も多いでしょう。 extern ステートメントはファイル スコープでのみ使用できるようです。
2. extern 変更された関数宣言。基本的に、変数と関数に違いはありません。関数名は、関数のバイナリ ブロックの先頭へのポインタです。ファイル a.c が b.c の関数を参照する必要がある場合、たとえば、b.c のプロトタイプが int fun (int mu) である場合、a.c で extern int fun (int mu) を宣言すると、fun を使用して何でもできるようになります。変数の宣言と同様に、extern int fun (int mu) は a.c 内のどこにでも配置でき、必ずしも a.c のファイル スコープに配置する必要はありません。他のモジュールの関数を参照する最も一般的な方法は、それらの関数の宣言を含むヘッダー ファイルを使用することです。 extern を使用することと、関数を参照するためにヘッダー ファイルをインクルードすることの違いは何ですか? extern 参照方法は、ヘッダー ファイルをインクルードするよりもはるかに簡単です。 extern の使用は簡単です。extern を使用して、参照する関数を宣言します。これはおそらく KISS 原則の表れです。これを行うことの明白な利点は、プログラムのコンパイルのプロセス (正確には前処理) が高速化され、時間が節約されることです。この違いは、大規模な C プログラムをコンパイルするときに非常に明白です。
3. さらに、extern 修飾子を使用して、C または C++ 関数の呼び出し仕様を指定できます。たとえば、C++ で C ライブラリ関数を呼び出すには、extern "C" を使用して、C++ プログラム内で参照される関数を宣言する必要があります。これは、リンク時に C 関数仕様を使用するようにリンカに指示するためにリンカによって使用されます。主な理由は、C++ プログラムと C プログラムをコンパイルした後のターゲット コードの命名規則が異なることです。
C 言語での extern の使用法に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。