Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語のextern(外部記憶クラス)とは?グローバル変数の基本と使い方を解説

C言語における記憶クラス(ストレージクラス)は、変数のスコープ(有効範囲)、生存期間、メモリ上の格納場所を決定する重要な概念です。C言語には以下の4つの記憶クラスが存在します。

  • auto
  • extern
  • static
  • register

グローバル変数/外部変数とは

externキーワードを用いて宣言されるのが、グローバル変数(外部変数)です。この種類の変数は、すべてのブロック(関数)の外側で宣言されます。

  • スコープ ─ グローバル変数のスコープはプログラム全体に及びます。どの関数からでもアクセスできます。

  • 初期値 ─ 明示的に初期化しない場合、デフォルト値として0(ゼロ)が自動的に設定されます。

アルゴリズム

処理の流れは以下の通りです。

START
Step 1: extern変数を宣言し、初期化する
Step 2: int型変数a=3を宣言し、初期化する
Step 3: 変数aの値を出力する
Step 4: 関数を呼び出す(Step 5へ)
Step 5: 呼び出された関数内でaを出力する(extern変数の値が参照される)

サンプルプログラム

以下は、extern記憶クラスを使用したC言語プログラムの一例です。

extern int a = 5; /* この 'a' はプログラム全体で有効 */
main( ) {
    int a = 3; /* この 'a' は main 関数内でのみ有効 */
    printf("%d", a);
    fun( );
}
fun( ) {
    printf("%d", a);
}

実行結果

3 5

main関数内ではローカル変数a(値は3)が出力され、fun( )関数内ではブロック外で宣言されたグローバル変数a(値は5)が参照されていることが確認できます。このように、同名のローカル変数が存在する場合、そのブロック内ではローカル変数が優先されます。

次に、ヘッダーファイルを利用して複数のファイル間で変数を共有する例を見てみましょう。

サンプルプログラム(複数ファイル構成)

externは、複数のファイル間で同じ変数を共有したい場合にも活用されます。以下は、変数定義をヘッダーファイルにまとめた例です。

External.h
extern int a = 14;
extern int b = 8;

externstorage.c ファイル
#include<stdio.h>
#include "External.h"
int main( ) {
    int sub = a - b;
    printf("%d - %d = %d", a, b, sub);
    return 0;
}

実行結果

a - b = 6

このように、externを用いることで、ヘッダーファイルで定義した変数を別のソースファイルから参照できるようになります。大規模なプロジェクトにおいて、モジュール間でデータを共有する際に非常に便利です。

まとめ

extern記憶クラスを持つ変数(グローバル変数)は、プログラム全体からアクセス可能であり、複数ファイル間でのデータ共有にも役立ちます。ただし、どこからでも書き換えられるため、大規模な開発では意図しない副作用が発生しないよう、使用箇所を最小限に抑えることが推奨されます。

  1. クラウドストレージとは?仕組み・バックアップとの違い・選び方を徹底解説

    クラウドストレージとは、ファイルをインターネット上(クラウド)に保存する仕組みのことです。パソコンの内蔵HDDや外付けハードディスク、USBメモリにデータを保管する代わりに、オンライン上にファイルを置いておくことができます。クラウドストレージを利用する理由はさまざまです。ローカルディスクの空き容量が不足している場合、クラウドを追加の保存先として活用できます。音楽コレクションをどこからでもストリーミング再生したい、自宅から仕事のファイルにアクセスしたい、旅行の動画を手軽に共有したい——そんなニーズにも応えられます。さらに、重要なファイルをパスワードと暗号化でしっかり保護したいという場合にも有効で

  2. C++の記憶クラス(ストレージクラス)とは?auto・static・externなどの5種類を解説

    C++プログラミングにおいて、記憶クラス(ストレージクラス)とは、変数や関数のスコープ(可視性)と寿命(ライフタイム)を定義するための指定子です。記憶クラス指定子は、修飾対象となる型の前に記述します。C++プログラムで使用できる記憶クラスには、以下の5種類があります。 auto register static extern mutable auto:自動記憶域期間 auto記憶クラス指定子は、自動記憶域を持つ変数を明示的に宣言するためのものです。ブロック内で宣言された変数のデフォルトはautoであり、自動記憶域を持つ変数xは、xが宣言されたブロックを抜けると破棄されます。 auto指定子は