C Academy · レッスン

extern とグローバル変数

ファイル間で共有します。

レッスン 3/413 ステップ

「extern とグローバル変数」はCoddyKit上の無料C Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。

グローバル変数

どの関数の外側でも宣言された変数は、ファイルスコープを持ち、プログラム全体にわたって存在します。これがグローバル変数です。

#include <stdio.h>
int counter = 0;
void bump(void) {
    counter++;
}
int main(void) {
    bump();
    bump();
    printf("counter = %d\n", counter);
    return 0;
}

グローバル変数は共有される

そのファイル内のすべての関数がグローバル変数を読み書きできます。便利である一方、誤用もしやすくなります。

#include <stdio.h>
int score = 100;
void penalty(void) { score -= 25; }
void bonus(void) { score += 10; }
int main(void) {
    penalty();
    bonus();
    printf("score = %d\n", score);
    return 0;
}

デフォルトの0初期化

初期化子のないグローバル変数は、自動的に0から始まります。

#include <stdio.h>
int total;
int main(void) {
    printf("total = %d\n", total);
    return 0;
}

externキーワード

externは、別の場所で定義されているグローバル変数を宣言します。変数用の領域を確保せずに、その変数が存在することをコンパイラーに伝えます。

#include <stdio.h>
int shared = 5;
extern int shared;
int main(void) {
    printf("shared = %d\n", shared);
    return 0;
}

宣言と定義の違い

定義は記憶領域を確保します。宣言は名前を示すだけです。extern宣言では記憶領域は確保されません。

#include <stdio.h>
int value = 42;
int main(void) {
    extern int value;
    printf("value = %d\n", value);
    return 0;
}

ファイル間で共有する

複数ファイルのプロジェクトでは、1つの.cファイルでグローバル変数を定義し、ほかのファイルではヘッダーにexternを記述して参照します。

#include <stdio.h>
extern int globalCount;
int globalCount = 3;
int main(void) {
    printf("globalCount = %d\n", globalCount);
    return 0;
}

関数にもexternを使える

関数はデフォルトで外部リンケージを持つため、プロトタイプ宣言は実質的にその関数のextern宣言です。

#include <stdio.h>
extern void hello(void);
void hello(void) {
    printf("Hello from extern\n");
}
int main(void) {
    hello();
    return 0;
}

グローバル変数の存続期間

グローバル変数はプログラムの開始から終了まで存在するため、すべての関数呼び出しをまたいで値を保持します。

#include <stdio.h>
int visits = 0;
void page(void) { visits++; }
int main(void) {
    page();
    page();
    page();
    printf("visits = %d\n", visits);
    return 0;
}

グローバル変数のリスク

どのコードからでもグローバル変数を変更できるため、バグの原因を追跡しにくくなります。可能な場合は、値を引数として渡してください。

#include <stdio.h>
int config = 1;
int compute(int input) {
    return input * config;
}
int main(void) {
    printf("%d\n", compute(8));
    return 0;
}

読み取り専用のグローバル変数

グローバル変数にconstを組み合わせると、誰も変更できない共有定数になります。

#include <stdio.h>
const int MAX_USERS = 50;
int main(void) {
    printf("MAX_USERS = %d\n", MAX_USERS);
    return 0;
}

実用的なパターン

複数の関数から読み取るグローバルな設定値は、一般的で許容される利用方法です。

#include <stdio.h>
int multiplier = 3;
int scale(int x) { return x * multiplier; }
int main(void) {
    printf("%d\n", scale(4));
    printf("%d\n", scale(7));
    return 0;
}

理解度チェック

externとグローバル変数について理解できているか確認しましょう。

まとめ:externとグローバル変数

グローバル変数と外部リンケージについて学びました。

  • グローバル変数はファイルスコープを持ち、プログラム全体にわたって存在する
  • デフォルト値は0で、すべての関数から共有される
  • externは別の場所で定義されたグローバル変数を宣言する
  • 定義は記憶領域を確保し、宣言は名前を示すだけ
  • 隠れた結合を避けるため、グローバル変数は控えめに使う
無料で開始

AI チューターと学ぶ C — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
39
レッスン
144

よくある質問

「extern とグローバル変数」レッスンは無料ですか?

はい。「extern とグローバル変数」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。

「extern とグローバル変数」で何を学びますか?

ファイル間で共有します。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「extern とグローバル変数」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC Academyレッスンでコードを書いて実行できますか?

はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. auto とローカルスコープ
  2. static 変数
  3. extern とグローバル変数
  4. register と const
← C Academyに戻る