C言語のexternとは?別ファイルの変数を使う仕組みをわかりやすく解説

目次

C言語文法解説シリーズ

本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説します。

👉 C言語文法解説シリーズ一覧はこちら

C言語で開発をしていると、
ファイルを分割してコードを書くようになります。

例えば、メイン処理と機能ごとにファイルを分けるような構成です。

main.c
sub.c

このとき、こんなコードを書きたくなることがあります。

int counter = 0;
void func(void)
{
    counter++;
}

このコード、一見問題なさそうに見えます。
同じプロジェクト内ですし、counter は存在しています。

しかし実際には コンパイルエラー になります。

なぜでしょうか?

それは、C言語では
ファイルごとに世界が分かれているからです。

sub.c から見ると
counter という変数は存在しません。

初心者さん

同じプログラムなのに?

エンジニアくん

C言語では別ファイルは別世界なんだ

この問題を解決するのが extern です。


externとは

extern は

別ファイルにある変数や関数を使うための宣言

です。

先ほどのコードはこう書き直します。

int counter = 0;
extern int counter;

void func(void)
{
    counter++;
}

こうするとコンパイルが通ります。

sub.c は

「counter はどこかに存在する」

と理解できるようになります。


externは変数を作っているわけではない

ここが重要なポイントです。

extern int counter;

これは変数を作っていません。

あくまで

どこかにある変数を使います

という宣言です。

つまり

メモリを確保するのは1回だけです。

int counter = 0;   // ←ここだけ
extern int counter;   // これは宣言だけ
初心者さん

じゃあ extern はコピーじゃないんですね

エンジニアくん

そう、同じ変数を見てるんだ


externを書かないとどうなる?

extern を書かずに別ファイルの変数を使うと
コンパイルまたはリンクエラーになります。

void func(void)
{
    counter++;
}

この場合、sub.c から見ると
counter は存在しません。

そのためエラーになります。

また、次のように書いた場合

int counter;

これは extern ではなく
新しい変数の定義 になります。

この場合は

multiple definition

というリンクエラーになります。

つまり extern は

同じ変数を共有するために必要な宣言

なのです。


定義と宣言の違い

extern を理解するには
「定義」と「宣言」の違いが重要です。

定義(変数を作る)

int counter;

宣言(存在だけ知らせる)

extern int counter;

extern は宣言です。


static との違い

ここで static とつながります。

static は

他ファイルから見えなくする

extern は

他ファイルから使う

真逆の役割です。

static int counter = 0;
extern int counter;

これはエラーになります。

static にすると
外から見えなくなるからです。

初心者さん

公開範囲の話だ

エンジニアくん

static と extern はセットで考えると良いよ

この考え方については、以下の記事で詳しく解説しています。

staticの文法的な使い方はこちらの記事で解説しています。

C言語でグローバル変数を避ける理由とは?staticを使った設計の基本


関数の場合のextern

実は関数はデフォルトで extern です。

void func(void)
{
}
void func(void);

これだけで使えます。

実は内部的には

extern void func(void);

と同じ意味です。


実務でのexternの使い方

通常はヘッダファイルに書きます。

extern int counter;
#include "counter.h"

int counter = 0;
#include "counter.h"

void func(void)
{
    counter++;
}

これが基本パターンです。


externを使う理由

extern を使う理由はシンプルです。

ファイルを分割しても
同じ変数や関数を共有するためです。

つまり extern は

複数ファイル開発で必須の文法

です。


まとめ

extern は

別ファイルの変数や関数を使うための宣言です。

特徴

・変数は作らない
・存在を知らせるだけ
・同じ変数を共有する
・static と真逆の役割

複数ファイル構成では必ず登場する文法です。

この記事が参考になった方へ

C言語の基本文法を一覧で整理しています。

👉 C言語文法解説シリーズ一覧はこちら

技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。

小さなご相談からでもお気軽にご連絡ください。

お問い合わせはこちら

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする


目次