C言語の外部変数externを完全ガイド!初心者でもわかる定義と使い方
生徒
「C言語でファイルを分けてプログラムを書くとき、変数を共有する方法があると聞きました。externって何なんでしょうか?」
先生
「externは外部変数を宣言するためのキーワードで、別のファイルにあるグローバル変数を使えるようにする仕組みです。」
生徒
「ひとつのファイルで作った変数を、ほかのファイルでも扱えるってことですか?」
先生
「その通りです。大きなプログラムでは機能ごとにファイルを分けます。そこで変数を共有したいときにexternを使います。」
1. externとは?外部変数を宣言する仕組み
外部変数は、あるファイルの先頭で宣言されたグローバル変数を、別のファイルから参照するための仕組みです。ファイルをまたいで使えるため、複数の関数や処理で共通したデータを共有できます。小さなプログラムではひとつのファイルに全てを入れても動きますが、規模が大きくなると、読みやすさや保守性のためにファイルを分ける必要があります。そこで活躍するのがexternというキーワードです。
externを使うと、元の変数を新しく作るのではなく、「そこにある変数を使わせてください」と宣言するだけになります。まるで巨大なメモ帳を用意して、複数の人が同じページを読んだり書いたりするようなイメージで、協力しながら処理を進められます。
2. 基本の書き方:定義と宣言のちがい
外部変数には、定義と宣言という二つの書き方があります。同じように見えて役割が違います。
- 変数の実体を作る → 定義
- すでにある変数を使う → 宣言(extern)
// どこかのファイルで定義
int score = 0;
// 別のファイルで宣言
extern int score;
この書き方で、ひとつの変数を複数のファイルで共有できるようになります。宣言はあくまで「ここには変数がある」と教えるだけで、新しい記憶領域は作りません。だからこそ、定義が一箇所にまとまり、プログラム全体の整合性が保たれます。
3. 実践例:二つのファイルで同じ変数を共有する
ここから実際のプログラム例を見てみます。scoreという整数を別ファイルでも使い、点数を増やす簡単な仕組みです。
// main.c
#include <stdio.h>
int score = 0; // 外部変数の定義
void add(void);
int main(void)
{
add();
add();
printf("合計 %d\n", score);
return 0;
}
// sub.c
extern int score; // 外部変数の宣言
void add(void)
{
score += 10;
}
合計 20
main.cで定義したscoreをsub.cで共有し、処理が正しく連動しています。これがexternの基本的な動作で、大きなプロジェクトでも同じ考え方で使われます。
4. externを使うメリット:一箇所管理とコードの分割
外部変数の強みは、データが一箇所にまとまることです。ひとつの変数を共有するため、どの処理が書き換えたのか追いやすくなります。逆に、同じ名前の変数を複数作ってしまうと、どれが本物かわからなくなり、バグの原因になります。外部変数は共通する値を正確に扱えるため、分業で開発する場合にも役立ちます。
また、ファイルを分割できる点も重要です。計算処理、画面表示、データ管理など、役割ごとに整理しやすくなり、C言語での本格的な開発を支える定番の技術になっています。
5. externとstaticの違いを整理
前の記事で学んだstaticと比べてみましょう。staticは同じファイルだけで使う限定的な変数でしたが、externは複数ファイルで共有します。どちらもグローバルな領域に置かれますが、見える範囲が反対になります。
- static → ファイル内限定で隠す
- extern → 別ファイルから使えるように公開する
家の中にある個人用の箱がstatic、誰でも使える共有棚がexternと考えると分かりやすいでしょう。目的に合わせて使い分けることで、安全性と便利さが両立できます。
6. ありがちなトラブルと対処法
初心者がつまずきやすいのは、定義と宣言の順番です。定義が無いのにexternだけ書いてしまうと、リンクエラーと呼ばれるエラーが出ます。これは最後の結び付けの段階で、実体が見つからないという警告です。対処はとても簡単で、どこかに必ず定義を書いておくだけです。
もうひとつは、複数の場所で同じ変数を定義してしまうパターンです。見かけは同じ名前でも、中身は別物になるため、動作がまとまりません。外部変数は一箇所で定義し、必要な場所で宣言する、という基本ルールを守れば安全です。
7. 関数もexternで共有できる
外部変数と同じ考え方で、関数の宣言にもexternを付けられます。ただし、関数の宣言には通常externが省略されています。関数は外から呼べる仕組みが基本となっているため、外部公開と同じ扱いになります。変数が公開か非公開かを選べるのに対して、関数は外部から呼ばれるのが前提で、同じ技術を使って実現しているということになります。
8. 小さな練習:別ファイルにある値を読み取る
最後に、小さな練習として「設定値を別ファイルで読み取る」例を示します。設定を切り替えるような場面で応用できます。
// config.c
int mode = 1;
// main.c
#include <stdio.h>
extern int mode;
int main(void)
{
if (mode == 1) {
printf("標準モード\n");
} else {
printf("拡張モード\n");
}
return 0;
}
標準モード
このようにexternはとてもシンプルで、実験しながら覚えられます。動きがわかりやすいので、学習を進めるほど便利さが見えてきます。
9. この記事の要点
- externは別ファイルの変数を利用する宣言
- 定義は一箇所、宣言はいくつでも可能
- ファイルを分割してもデータを共有できる
- staticと使い分けることで安全に管理できる