C コードのさまざまな場所でこの単語が使用されているのを見ましたがstatic
、これは C# の静的関数/クラス (実装がオブジェクト間で共有される) のようなものですか?
ベストアンサー1
static
通常、キーワードは次の場所に表示されます。
- 関数内の静的変数は、呼び出し間でその値を保持します。
- 静的グローバル変数または関数は、それが宣言されているファイル内でのみ「表示されます」。
(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
、ユーザーがアクセスできないようにする必要があります。これはカプセル化であり、良い方法です。
[Wikipedia][1]より引用:
C プログラミング言語では、
static
グローバル変数および関数で、そのスコープを格納ファイルに設定するために使用されます。ローカル変数では、static
自動的に割り当てられたメモリではなく、静的に割り当てられたメモリに変数を格納するために使用されます。言語ではどちらのタイプのメモリの実装も規定されていませんが、静的に割り当てられたメモリは通常、コンパイル時にプログラムのデータ セグメントに予約されますが、自動的に割り当てられたメモリは通常、一時的な呼び出しスタックとして実装されます。
2 番目の質問に答えると、C# とは異なります。
ただし、C++ では、static
クラス属性 (同じクラスのすべてのオブジェクト間で共有される) とメソッドを定義するためにも使用されます。C にはクラスがないため、この機能は無関係です。
さらに、C では、static
配列宣言子で [配列の最小サイズを指定][1] するために使用できます (関数以外の配列宣言子ではこのキーワードは使用できません)。次の宣言を検討してください。
void func(int foo[static 42]);
この関数は少なくとも 42func()
個の要素を持つ配列を受け取ります。
C++ ではこのstatic
キーワードの使用はサポートされていないことに注意してください。