カテゴリ: C言語 更新日: 2025/12/31

C言語の外部変数externを完全ガイド!初心者でもわかる定義と使い方

C言語の外部変数(extern)の定義と利用方法
C言語の外部変数(extern)の定義と利用方法

先生と生徒の会話形式で理解しよう

生徒

「C言語でファイルを分けてプログラムを書くとき、変数を共有する方法があると聞きました。externって何なんでしょうか?」

先生

「externは外部変数を宣言するためのキーワードで、別のファイルにあるグローバル変数を使えるようにする仕組みです。」

生徒

「ひとつのファイルで作った変数を、ほかのファイルでも扱えるってことですか?」

先生

「その通りです。大きなプログラムでは機能ごとにファイルを分けます。そこで変数を共有したいときにexternを使います。」

1. externとは?外部変数を宣言する仕組み

1. externとは?外部変数を宣言する仕組み
1. externとは?外部変数を宣言する仕組み

外部変数は、あるファイルの先頭で宣言されたグローバル変数を、別のファイルから参照するための仕組みです。ファイルをまたいで使えるため、複数の関数や処理で共通したデータを共有できます。小さなプログラムではひとつのファイルに全てを入れても動きますが、規模が大きくなると、読みやすさや保守性のためにファイルを分ける必要があります。そこで活躍するのがexternというキーワードです。

externを使うと、元の変数を新しく作るのではなく、「そこにある変数を使わせてください」と宣言するだけになります。まるで巨大なメモ帳を用意して、複数の人が同じページを読んだり書いたりするようなイメージで、協力しながら処理を進められます。

2. 基本の書き方:定義と宣言のちがい

2. 基本の書き方:定義と宣言のちがい
2. 基本の書き方:定義と宣言のちがい

外部変数には、定義と宣言という二つの書き方があります。同じように見えて役割が違います。

  • 変数の実体を作る → 定義
  • すでにある変数を使う → 宣言(extern)

// どこかのファイルで定義
int score = 0;

// 別のファイルで宣言
extern int score;

この書き方で、ひとつの変数を複数のファイルで共有できるようになります。宣言はあくまで「ここには変数がある」と教えるだけで、新しい記憶領域は作りません。だからこそ、定義が一箇所にまとまり、プログラム全体の整合性が保たれます。

3. 実践例:二つのファイルで同じ変数を共有する

3. 実践例:二つのファイルで同じ変数を共有する
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を使うメリット:一箇所管理とコードの分割

4. externを使うメリット:一箇所管理とコードの分割
4. externを使うメリット:一箇所管理とコードの分割

外部変数の強みは、データが一箇所にまとまることです。ひとつの変数を共有するため、どの処理が書き換えたのか追いやすくなります。逆に、同じ名前の変数を複数作ってしまうと、どれが本物かわからなくなり、バグの原因になります。外部変数は共通する値を正確に扱えるため、分業で開発する場合にも役立ちます。

また、ファイルを分割できる点も重要です。計算処理、画面表示、データ管理など、役割ごとに整理しやすくなり、C言語での本格的な開発を支える定番の技術になっています。

5. externとstaticの違いを整理

5. externとstaticの違いを整理
5. externとstaticの違いを整理

前の記事で学んだstaticと比べてみましょう。staticは同じファイルだけで使う限定的な変数でしたが、externは複数ファイルで共有します。どちらもグローバルな領域に置かれますが、見える範囲が反対になります。

  • static → ファイル内限定で隠す
  • extern → 別ファイルから使えるように公開する

家の中にある個人用の箱がstatic、誰でも使える共有棚がexternと考えると分かりやすいでしょう。目的に合わせて使い分けることで、安全性と便利さが両立できます。

6. ありがちなトラブルと対処法

6. ありがちなトラブルと対処法
6. ありがちなトラブルと対処法

初心者がつまずきやすいのは、定義と宣言の順番です。定義が無いのにexternだけ書いてしまうと、リンクエラーと呼ばれるエラーが出ます。これは最後の結び付けの段階で、実体が見つからないという警告です。対処はとても簡単で、どこかに必ず定義を書いておくだけです。

もうひとつは、複数の場所で同じ変数を定義してしまうパターンです。見かけは同じ名前でも、中身は別物になるため、動作がまとまりません。外部変数は一箇所で定義し、必要な場所で宣言する、という基本ルールを守れば安全です。

7. 関数もexternで共有できる

7. 関数もexternで共有できる
7. 関数もexternで共有できる

外部変数と同じ考え方で、関数の宣言にもexternを付けられます。ただし、関数の宣言には通常externが省略されています。関数は外から呼べる仕組みが基本となっているため、外部公開と同じ扱いになります。変数が公開か非公開かを選べるのに対して、関数は外部から呼ばれるのが前提で、同じ技術を使って実現しているということになります。

8. 小さな練習:別ファイルにある値を読み取る

8. 小さな練習:別ファイルにある値を読み取る
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. この記事の要点

9. この記事の要点
9. この記事の要点
  • externは別ファイルの変数を利用する宣言
  • 定義は一箇所、宣言はいくつでも可能
  • ファイルを分割してもデータを共有できる
  • staticと使い分けることで安全に管理できる
カテゴリの一覧へ
新着記事
New1
C++
C++のメンバアクセス演算子を完全解説!初心者でもわかる . → :: の使い方まとめ
New2
Rust
Rustの文字列を極める!&str(文字列スライス)の基本概念とString型との違い
New3
C++
C++のキャスト演算子を完全解説!dynamic_cast・static_cast・const_cast・reinterpret_castを初心者向けに説明
New4
C++
C++開発のIDE選びを完全ガイド!初心者でもわかるCLion・Eclipse CDT・Qt Creator比較
人気記事
No.1
Java&Spring記事人気No1
C++
C++の主要な実装をわかりやすく解説!GCC・Clang・MSVCの違いと特徴
No.2
Java&Spring記事人気No2
C言語
C言語を学ぶ初心者におすすめの環境構築手順【2025年版】
No.3
Java&Spring記事人気No3
C言語
C言語のソースコードとヘッダファイルの役割とは?初心者向けにわかりやすく解説!
No.4
Java&Spring記事人気No4
C言語
C言語をオンラインで実行できる便利なコンパイラサービスまとめ【初心者向け】
No.5
Java&Spring記事人気No5
C言語
C言語開発でよく使われるエディタとIDEランキング【初心者向け完全ガイド】
No.6
Java&Spring記事人気No6
C言語
Visual Studio CodeでC言語を実行する方法【拡張機能の設定と実行手順】
No.7
Java&Spring記事人気No7
C++
C++リンカとコンパイラのオプション設定を完全ガイド!初心者にもわかる開発環境の基礎
No.8
Java&Spring記事人気No8
C言語
C言語の列挙型(enum)の使い方を完全ガイド!初心者でもわかる基本操作