Cで静的とはどういう意味ですか?

<オール>
  • 関数内の静的変数は、呼び出し間でその値を保持します。
  • 静的グローバル変数または関数は、それが宣言されているファイルでのみ「認識」されます
  • (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 ファイルがある場合、通常は少数の「公開」機能のみがユーザーに公開されます。残りの機能は static にする必要があります 、ユーザーがそれらにアクセスできないようにします。これはカプセル化であり、良い習慣です。

    ウィキペディアの引用:

    2 番目の質問に答えると、C# とは異なります。

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


    ここでカバーされていない使用法がもう 1 つあります。それは、関数への引数としての配列型宣言の一部としてです:

    int someFunction(char arg[static 10])
    {
        ...
    }
    

    このコンテキストでは、これは、この関数に渡される引数が char 型の配列でなければならないことを指定します 少なくとも 10 個の要素が含まれています。詳細については、こちらの質問を参照してください。


    簡単な答え ... 場合による

    <オール> <リ>

    静的に定義されたローカル変数は、関数呼び出し間で値を失いません。言い換えれば、それらはグローバル変数ですが、それらが定義されているローカル関数にスコープされています。

    <リ>

    静的グローバル変数は、それらが定義されている C ファイルの外では見えません。

    <リ>

    静的関数は、定義されている C ファイルの外では表示されません。