これで分かる!externとincludeの違いを徹底解説:C/C++初心者がつまずくポイントを丸わかり

  • このエントリーをはてなブックマークに追加
これで分かる!externとincludeの違いを徹底解説:C/C++初心者がつまずくポイントを丸わかり
この記事を書いた人

中嶋悟

名前:中嶋 悟(なかじま さとる) ニックネーム:サトルン 年齢: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とincludeの違いを理解する第一歩

プログラミングの世界にはよく出てくる「extern」と「include」。外見は似ているけど、役割はまったく別物です。まずは外部の力関係を押さえると理解が進みます。
「extern」は“外部の宣言”を伝えるための道具です。現在のファイルに「この変数や関数は他のファイルにあるよ」と伝えるだけで、実体を置くわけではありません。リンクの段階で実体がどこにあるのかを結びつけ、プログラムを動かします。つまりexternは“どこにあるかを知らせる合図”のようなものです。
一方の「include」は“その場にファイルをくっつける”行為です。ヘッダーファイルを読み込むことで、宣言や型を現在のファイルに丸ごと取り込みます。読み込まれた宣言はそのまま現在のコードの一部になりますので、同じ名前の宣言が複数のファイルに重複して現れないようにガードを使うのが基本です。
このように、externは宣言の共有、includeは宣言の集約というように役割が分かれています。これを覚えるだけで「どのファイルに何を置くべきか」が見えるようになり、後のコンパイルエラーを減らす第一歩になります。

externとincludeの基本の違い

「 extern 」は外部の宣言を伝えるための記述です。変数や関数の宣言を別のファイルと共有する時に使います。宣言だけを示し、実体は別の場所にあります。実体はリンク時に結びつき、プログラム全体で一つだけ存在する必要があります。反対に「include」は“その場にファイルを貼り付ける”行為です。ヘッダファイルを取り込むことで、宣言や型、マクロの定義まで現在のファイルに取り込みます。読み込むファイルが増えるとコンパイル時間が長くなることがあるため、ヘッダの内容は最小限にして重複を避ける設計が重要です。
また、よくある間違いとして、ヘッダを使って変数を定義してしまうケースがあります。これを避けるためには、ヘッダには「宣言」を置き、実体は1つのソースファイルにだけ置く、つまりexternを使って宣言し、int x;の定義は1か所にする、というルールがベースになります。
表で比較すると分かりやすいので後ほど見てください。

able>項目externinclude意味外部の変数/関数の宣言を示すファイルの内容を現在のファイルに挿入する役割宣言の共有宣言・定義を含むコードを取り込む使い方例extern int x;#include "header.h"注意点定義は1つにするヘッダの二重読み込みを防ぐble>

実践的な使い分けと注意点

実務では、externとincludeをどう使い分けるかが勝負どころです。まずは宣言と定義を分けて管理することが基本です。
ヘッダファイルには変数の宣言、関数のプロトタイプ、定数の定義を置くのではなく、宣言だけを置きます。実体は対応するソースファイルに置くようにします。これにより、複数の翻訳単位で同じ変数を複数回定義してしまうミスを避けられます。
例えば、ゲームのスコアを複数ファイルで使う場合、スコアを保持する変数xをextern宣言だけヘッダに置き、実体はgame.cに「int x = 0;」と定義します。
また、ヘッダの読み込みを最小限にする工夫として、前方宣言だけで済む場合は宣言を使い、必要な情報だけを伝えるようにします。
そして、ガードを必ず使うこと。#ifndef HEADER_H #define HEADER_H ... #endif のようなガードを入れて、二重読み込みを防ぎます。これらのポイントを押さえると、プログラムの規模が大きくなっても混乱しにくくなります。

ピックアップ解説

externという言葉を深掘りする小ネタトーク: 部活の部室で友だちと話していたとき、externを宣言の“合図”として例えるとすごくしっくり来るんだ。外部にある変数や関数の存在を知らせるだけで、実体は別の部屋にある。だから宣言だけをヘッドファイルに置いておけば、他のファイルはその存在を知りつつ自分の場所を変えずに動ける。こうして設計を分離しておくと、後から部室の配置換えをしても、各ファイルの役割が乱れにくくなる。つまりexternは“共有の設計図”であり、定義は1か所に集約するルールとセットで運用するのがベストだと感じる。


ITの人気記事

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

新着記事

ITの関連記事