externとグローバル変数の違いを徹底解説|中学生にも分かる実例つき

  • このエントリーをはてなブックマークに追加
externとグローバル変数の違いを徹底解説|中学生にも分かる実例つき
この記事を書いた人

中嶋悟

名前:中嶋 悟(なかじま さとる) ニックネーム:サトルン 年齢:28歳 性別:男性 職業:会社員(IT系メーカー・マーケティング部門) 通勤場所:東京都千代田区・本社オフィス 通勤時間:片道約45分(電車+徒歩) 居住地:東京都杉並区・阿佐ヶ谷の1LDKマンション 出身地:神奈川県横浜市 身長:175cm 血液型:A型 誕生日:1997年5月12日 趣味:比較記事を書くこと、カメラ散歩、ガジェット収集、カフェ巡り、映画鑑賞(特に洋画)、料理(最近はスパイスカレー作りにハマり中) 性格:分析好き・好奇心旺盛・マイペース・几帳面だけど時々おおざっぱ・物事をとことん調べたくなるタイプ 1日(平日)のタイムスケジュール 6:30 起床。まずはコーヒーを淹れながらニュースとSNSチェック 7:00 朝食(自作のオートミールorトースト)、ブログの下書きや記事ネタ整理 8:00 出勤準備 8:30 電車で通勤(この間にポッドキャストやオーディオブックでインプット) 9:15 出社。午前は資料作成やメール返信 12:00 ランチはオフィス近くの定食屋かカフェ 13:00 午後は会議やマーケティング企画立案、データ分析 18:00 退社 19:00 帰宅途中にスーパー寄って買い物 19:30 夕食&YouTubeやNetflixでリラックスタイム 21:00 ブログ執筆や写真編集、次の記事の構成作成 23:00 読書(比較記事のネタ探しも兼ねる) 23:45 就寝準備 24:00 就寝


externとグローバル変数の違いを徹底解説|中学生にも分かる実例つき

プログラムを書くとき、外から使える変数があると便利です。しかしどこでどう使われるかを決める仕組みがあり、覚えておくと後で困らなくなります。ここで大事になるのが extern とグローバル変数という言葉です。
extern は他のファイルで定義されている変数を参照するための宣言であり、実体は別の場所にあります。これに対しグローバル変数は関数の外で宣言され、プログラム全体で共有される変数です。つまり extern は宣言だけで実体は別ファイルにあるという性質を持ち、グローバル変数は実体と参照が同じファイルで扱われるという性質を持つと理解すると良いでしょう。
この違いを理解しておくとビルド時のエラーを減らせます。忘れがちなのは extern を使うときは「一つの場所でだけ変数を定義する」というルールを守ることです。複数箇所で定義すると重複定義エラーが発生します。従って外部とのつながりを作るときは宣言と定義の場所を明確に分けて設計しましょう。

次に実務的な場面を考えます。A.c で int count = 0; と実体を作り、B.c で extern int count; と宣言します。これで B.c は count の存在を知るだけで、値の作り手にはなりません。実体を A.c が持っているため、B.c と A.c が同じ変数を共有します。ここが extern の「協調動作」の部分です。もう少しややこしく感じるのは、別ファイルで同じ名前の変数を別に定義してしまうと リンクエラー になる点です。こうしたトラブルを避けるにはコード設計の初期段階で変数の定義箇所と宣言箇所を厳密に分け、ビルド設定を統一することが重要です。
プログラムが大きくなるほどこの設計が効いてきます。

用語の整理:グローバル変数と extern の役割

グローバル変数とは、プログラム全体から参照できる変数のことです。関数の外で宣言され、どのファイルからもアクセス可能ですが、同じ翻訳単位内でのみ有効です。extern は別ファイルで定義された変数を使うときに用いる宣言です。宣言だけを行い、実体は別のファイルにあることを示します。この組み合わせは大規模なソフトウェア開発でとても役に立ちます。宣言と定義を分けることで、複数ファイルのコードをうまく結びつけられ、保守性が高まります。

この整理を頭に置いておくと、後でコードを読んだときに「どこで変数が作られているのか」「どのファイルが参照しているのか」がすぐ分かります。初心者にとっては最初は難しく感じるかもしれませんが、宣言と定義を明確に分ける癖をつけると、エラーの原因を自分で追いやすくなります。
結果として、クラスター構成の大きなプログラムでもミスが減り、動くまでの時間を短縮できるのです。

実際のコードでの違いの例

現実のプロジェクトでは extern を使って複数のファイル間で変数をやり取りします。例えば fmain.c で int total = 100; と定義します。futil.c では extern int total; と宣言します。これにより futil.c は total の実体を知っていて使えるのですが、自分で総計を作る実体は持ちません。こうしてメインのファイルが総計を管理し、補助ファイルは参照だけを行う動きが成立します。
この仕組みを誤って使うと問題が生まれます。たとえば total の定義がもう一つのファイルにもあるとリンク時に「重複定義」というエラーが出ます。あるいは extern の宣言が実体と一致していないと「型が違う」などの別のエラーが出ます。つまり きちんと宣言と定義の対応を合わせることが何より大切です。

ピックアップ解説

koneta: extern の話をしているとき、友達の家の鍵の渡し方を思い出すんだ。ある部屋には大事な箱があって、それを使いたい人は必ず鍵を使う前に『この箱は別の部屋にある実体です』と宣言する。extern はその宣言だけを別の部屋に伝える役割。だから宣言された部屋は実体を作らなくて済み、他の部屋の人は参照だけを行う。これが大事なポイント。もし同じ名前の箱を複数の部屋で独立して作ってしまうと、鍵を誰が持っているのか、誰が箱の中身を更新しているのかが分からなくなり、混乱が生まれる。extern を使うと「どこで実体を作るか」を決めておけば、他の部屋はその実体を共有できる。実務ではこの共有の仕組みがソフトの規模を大きく左右するんだ。


ITの人気記事

ズームとズームワークプレイスの違いとは?初心者でもわかる徹底解説!
1353viws
青写真と青焼きの違いとは?簡単解説でわかりやすく理解しよう!
1066viws
「画素(ピクセル)とは何?解説と画像の違いをやさしく理解しよう」
936viws
CADデータとDXFデータの違いを徹底解説!初心者でもわかる使い分けのポイント
870viws
スター結線とデルタ結線の違いを徹底解説!初心者でも分かる電気の基本
830viws
初心者でもわかる!しきい値と閾値の違いを徹底解説
707viws
5GとXi(クロッシィ)ってどう違うの?初心者にもわかりやすく解説!
701viws
RGBとsRGBの違いって何?初心者でもわかる色の基本知識
665viws
インターフォンとインターホンの違いって何?わかりやすく解説!
632viws
RGBとVGAの違いを徹底解説!初心者にもわかりやすい映像信号の基礎知識
620viws
API仕様書とIF仕様書の違いを徹底解説!初心者でもわかるポイントとは?
615viws
HTTPとHTTPSの違いをわかりやすく解説!安全なネット利用のために知っておきたいポイント
597viws
SSDとUSBメモリの違いを徹底解説!初心者でもわかる保存デバイスの選び方
578viws
IPアドレスとデフォルトゲートウェイの違いをわかりやすく解説!ネットワークの基本を理解しよう
576viws
インプレッション数とクリック数の違いを徹底解説 — CTRを上げるための基礎と落とし穴
526viws
USBフラッシュメモリとUSBメモリの違いとは?初心者でもわかる解説!
511viws
モバイルデータ通信番号と電話番号の違いを徹底解説!初心者でもわかるスマホの基礎知識
506viws
グロメットとコンジットの違いとは?わかりやすく解説!
502viws
ベアリングとリテーナーの違いとは?初心者でもわかる基本の解説
497viws
USB充電器とアダプターの違いとは?初心者にもわかりやすく解説!
490viws

新着記事

ITの関連記事