extern とグローバル変数
ファイル間で共有します。
「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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- auto とローカルスコープ
- static 変数
- extern とグローバル変数
- register と const