工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

C 言語のストレージクラス理解: auto、extern、static、register を解説

C 言語におけるストレージクラスとは?

ストレージクラスは、変数のスコープ、配置場所、初期化、生存期間、アクセス可能性を定義します。C では、すべての変数は型を持つだけでなく、どこでどのようにアクセスできるかを決定するストレージクラスも割り当てられます。

標準的なストレージクラスは 4 つあります:

auto ストレージクラス

auto で宣言された変数 (ローカル変数のデフォルト) は、定義されたブロック内でのみ存在します。ブロックを抜けると破棄され、明示的に設定しない限り不定値で初期化されます。

int add(void) {
    int a = 13;
    auto int b = 48; // auto は省略可能
    return a + b;
}

スコープのデモンストレーション:

#include <stdio.h>
int main(void) {
    auto int j = 1;
    {
        auto int j = 2;
        {
            auto int j = 3;
            printf("%d ", j); // 3 を出力
        }
        printf("\t%d ", j); // 2 を出力
    }
    printf("%d\n", j); // 1 を出力
}

出力: 3 2 1

extern ストレージクラス

extern キーワードは、別の翻訳単位で定義されている変数や関数を宣言します。ソースファイル間でのデータ共有を可能にします。

/* main.c */
#include <stdio.h>
extern int i; // 宣言
int main(void) {
    printf("value of the external integer is = %d\n", i);
    return 0;
}
/* original.c */
#include <stdio.h>
int i = 48; // 定義

両ファイルを同時にコンパイル: gcc main.c original.c -o program。./program 実行で出力:

value of the external integer is = 48

static ストレージクラス

static 変数はプログラムの期間中、値を保持します。ローカル static とファイルスコープ static の 2 通りで使用できます。

/* グローバル static */
static int counter = 7;
void next(void) {
    /* ローカル static */
    static int iteration = 13;
    iteration++;
    printf("iteration=%d and counter=%d\n", iteration, counter);
}
int main(void) {
    while (counter < 10) {
        next();
        counter++;
    }
    return 0;
}

出力:

iteration=14 and counter=7
iteration=15 and counter=8
iteration=16 and counter=9

register ストレージクラス

頻繁にアクセスされ、CPU レジスタに収まる変数に register を使用。レジスタが不足している場合、コンパイラはヒントを無視することがあります。

#include <stdio.h>
int main(void) {
    register int weight;
    /* アドレス取得は失敗する */
    // int *ptr = &weight; // コンパイルエラー
    return 0;
}

コンパイル結果:

error: address of register variable 'weight' requested

まとめ表

ストレージクラス宣言コンテキスト格納場所デフォルト値スコープ生存期間
auto関数/ブロック内メモリ不定関数/ブロック関数/ブロック
register関数/ブロック内CPUレジスタ不定関数/ブロック関数/ブロック
externすべての関数の外側メモリゼロプログラム全体プログラム実行中
static (ローカル)関数/ブロック内メモリゼロ関数/ブロックプログラム実行中
static (グローバル)すべての関数の外側メモリゼロファイルプログラム実行中

重要なポイント

C言語

  1. C# クラスとオブジェクト:堅牢な OOP の基礎
  2. C# static キーワード:静的変数、メソッド、クラスをマスターする
  3. C# 入れ子クラスを理解する:定義、使用法、継承
  4. C++クラスとオブジェクト完全ガイド:オブジェクト指向プログラミングの実践
  5. C++フレンド関数とフレンドクラス:アクセス制御のマスター
  6. C++クラステンプレート完全ガイド:実践的なジェネリックプログラミング
  7. C言語ストレージクラス完全理解:スコープ・ライフタイム・パフォーマンス
  8. C言語のストレージクラス:スコープ、ライフタイム、使い分け
  9. C++ストレージクラス完全解説:スコープ、ライフタイム、使い方
  10. C++インターフェース完全理解:抽象クラスと純粋仮想関数
  11. C#プログラム構造の理解:コアコンポーネントと例