※本記事は広告を含みます。
C言語文法解説シリーズ
本記事は「C言語文法解説シリーズ」の1つです。
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言語の基本文法を一覧で整理しています。
技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。
小さなご相談からでもお気軽にご連絡ください。









コメント