1. extern
とは何か?
C言語でのextern
は、他のファイルで定義された変数や関数を利用するための「他所のものを借りる」合図です。例えば、あるファイルで定義したグローバル変数を別のファイルで使いたい場合に使われます。プログラムが複数のファイルに分割される場合、各ファイル間でデータを共有するためにextern
が活躍します。
想像してみてください。プログラムの中に部屋がたくさんあって、extern
は隣の部屋から道具を借りてくるための「貸し借り契約書」のような役割です。「ここにはないけど、隣の部屋にあるよ」という意味です。
例
// file1.c
int g_data = 100;
// file2.c
extern int g_data;
void printData() {
printf("%d\n", g_data); // file1.cのg_dataにアクセス
}
この例では、g_data
がfile1.c
で定義されていますが、extern
を使うことでfile2.c
からその変数にアクセスしています。
2. extern
とグローバル変数の関係
extern
は特にグローバル変数と深い関係があります。グローバル変数は、プログラム全体で一度定義されると、どのファイルからでもアクセス可能です。しかし、そのままでは他のファイルがどこに変数があるか知らないので、extern
を使って「ここにあるよ!」と教える必要があります。
注意点としては、extern
は宣言に過ぎないので、メモリは割り当てられません。変数のメモリ割り当ては、元のファイルで行われます。
グローバル変数の例
// file1.c
int counter = 0;
// file2.c
extern int counter; // 他のファイルで定義されたcounterを使用
void incrementCounter() {
counter++; // counterの値を更新
}
3. ヘッダーファイルにおけるextern
の利用
大規模なプロジェクトになると、変数や関数を何度も宣言するのは面倒です。ここで便利なのが「ヘッダーファイル」です。ヘッダーファイルは、他のファイルで共有するための情報を一箇所にまとめるファイルです。このヘッダーファイルにextern
宣言をまとめておくことで、他のファイルが同じグローバル変数や関数を参照できるようになります。
ヘッダーファイルは、プロジェクト全体の「ツールボックス」とも言えます。共通の道具を一箇所に集めておいて、必要なファイルでそのツールを使う、といったイメージです。
ヘッダーファイルの例
// globals.h
extern int global_variable;
void printGlobalVariable();
// file1.c
#include "globals.h"
int global_variable = 10;
// file2.c
#include "globals.h"
void printGlobalVariable() {
printf("%d\n", global_variable);
}
4. よくあるextern
の間違い
extern
の使い方にはいくつかの注意点があります。例えば、extern
で宣言した変数に初期値を設定することはできません。extern
はあくまで「宣言」であり、「定義」ではないからです。また、変数の定義が行われていないファイルでextern
宣言をすると、リンクエラーが発生します。
よくある間違い
extern int data = 100; // 初期化はNG
上記のように、extern
と一緒に変数を初期化しようとするとエラーが発生します。extern
は他のファイルで定義された変数を参照するためのものであり、変数を定義したり初期化したりするためのものではないからです。
5. extern
を使った実践的な使用例
extern
は特に大規模なプロジェクトで活躍します。例えば、複数のモジュールにまたがるプログラムでは、共通のデータや関数をextern
で宣言し、各ファイルで再利用することができます。
このようなプロジェクトでは、extern
を使うことでプログラムのモジュール化が進み、保守性や可読性が向上します。これにより、各ファイルが独立して機能しつつ、必要なデータを共有できるようになります。
実践的な例
// main.c
#include "globals.h"
int main() {
printGlobalVariable(); // 他のファイルで定義された関数を呼び出し
return 0;
}
// globals.c
#include "globals.h"
int global_variable = 100;
void printGlobalVariable() {
printf("%d\n", global_variable); // グローバル変数を出力
}
この記事では、extern
の基本から実践的な使い方まで網羅されています。C言語におけるプログラムの分割や再利用を促進する重要なキーワードとして、extern
の役割を理解することは大変重要です。