【C++学習|豆知識】C++開発の必須知識!複数ファイルで変数を共有する「extern」の正しい使い方

1. 導入:なぜ「extern」が必要なのか

C++で大規模なプログラムを開発していると、複数のソースファイルから同じ変数(グローバル変数など)を参照したい場面が出てきます。しかし、通常の方法で変数を定義しようとすると、複数のファイルで定義が重複してしまい、コンパイルエラー(多重定義)が発生します。この課題を解決し、他のファイルで定義された変数を「宣言だけして参照できるようにする」のが extern です。

2. 基礎知識:翻訳単位とリンク

C++では、各ソースファイル(.cpp)はコンパイル時に「翻訳単位」として独立して処理されます。あるファイルで作成した変数は、そのままでは他のファイルからは見えません。そこで、変数の「定義(メモリの確保)」と「宣言(名前の参照)」を分ける必要があります。extern を使うことで、コンパイラに対して「この変数は別の場所で定義されているので、リンク時に探してください」と伝えることができるのです。

3. 実装/解決策:正しい使い方のルール

extern を使う際は、以下のルールを守るのが鉄則です。
1. 変数の実体(定義)は、必ずどこか1つのファイルで行う(extern を付けない)。
2. その変数を参照したい他のファイルでは、extern を付けた宣言を記述する。
3. ヘッダーファイル(.h)を活用して、extern 宣言を共通化する。

4. サンプルプログラム

以下は、変数「g_app_status」を複数のファイルで共有する例です。

[Global.h]
// 他のファイルから参照できるよう、宣言のみを記述
extern int g_app_status;

[Main.cpp]
include
include “Global.h”

// 変数の実体を定義(ここで初めてメモリが確保される)
int g_app_status = 1;

int main() {
std::cout << "現在のステータス: " << g_app_status << std::endl; return 0; } [Sub.cpp]
include
include “Global.h”

void updateStatus() {
// extern 宣言により、Main.cpp で定義された変数にアクセス可能
g_app_status = 2;
std::cout << "ステータスを更新しました: " << g_app_status << std::endl; }

5. 応用・注意点:現場で役立つポイント

extern を使う際の注意点として、グローバル変数の多用は「どのファイルで値が書き換わったのか」を追跡しにくくするため、依存関係が複雑になりがちです。

また、C++17以降では、インライン変数(inline int g_shared_value;)を使用することで、ヘッダーファイル内で直接定義しても多重定義エラーを回避できるようになりました。可能な限りグローバル変数を避け、どうしても必要な場合にのみ extern を使うか、最新の C++ 標準機能を検討することをおすすめします。

コメント

タイトルとURLをコピーしました