1. ホーム
  2. c

[解決済み] C言語における「static」の意味とは?

2022-03-18 20:46:44

質問

という言葉を目にしたことがあります。 static Cコードのさまざまな場所で使用されています。これは、C#の静的関数/クラス(オブジェクト間で実装が共有される)のようなものでしょうか?

どのように解決するのですか?

  1. 関数内の静的変数は、呼び出しの間、その値を保持します。
  2. 静的グローバル変数または関数は、宣言されたファイルの中でのみ見ることができます。

(1)は、初心者の方にとってはより外国的な話題ですので、ここで例を挙げてみましょう。

#include <stdio.h>

void foo()
{
    int a = 10;
    static int sa = 10;

    a += 5;
    sa += 5;

    printf("a = %d, sa = %d\n", a, sa);
}


int main()
{
    int i;

    for (i = 0; i < 10; ++i)
        foo();
}

これが印刷されます。

a = 15, sa = 15
a = 15, sa = 20
a = 15, sa = 25
a = 15, sa = 30
a = 15, sa = 35
a = 15, sa = 40
a = 15, sa = 45
a = 15, sa = 50
a = 15, sa = 55
a = 15, sa = 60

これは、ある関数が起動するまでの間に何らかの状態を保持する必要があり、かつグローバル変数を使いたくない場合に有効です。しかし、この機能はあまり使わないでください。スレッドセーフでなくなり、理解しにくいコードになってしまいます。

(2)アクセスコントロール機能として広く使われている。ある機能を実装した .c ファイルがあったとして、それは通常いくつかの "public" 関数だけをユーザーに公開します。残りの関数は static のように、ユーザーがアクセスできないようにします。これがカプセル化であり、良い習慣である。

引用元 ウィキペディア :

プログラミング言語Cでは、static は、グローバル変数と 関数は、そのスコープを を含むファイルです。ローカル変数では staticは、変数 を静的に割り当てたメモリ 自動的に割り当てられるのではなく メモリに保存されます。言語では どちらの実装も タイプのメモリがありますが、静的に割り当てられた メモリは通常、データ セグメントを作成します。 一方、自動 通常、割り当てられたメモリは は、トランジェント・コールスタックとして実装されています。

そして2つ目の質問に答えると、C#のようにはいきません。

ただし、C++の場合。 static は、クラス属性(同じクラスのすべてのオブジェクトで共有される)やメソッドを定義するためにも使用されます。C言語ではクラスが存在しないので、この機能は関係ありません。