(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 ファイルの外では表示されません。