Cの静的関数とは何ですか?

static 関数は、同じファイル内の他の関数からのみ見える関数です (より正確には 同じ翻訳単位 ).

編集 :質問の作成者が「クラス メソッド」を意味していると考えた人のために:質問にタグが付けられているため C 彼は単純な古い C 関数を意味します。 (C++/Java/...) クラス メソッドの場合、static つまり、このメソッドはクラス自体で呼び出すことができ、そのクラスのインスタンスは必要ありません。


C の静的関数と C++ の静的メンバー関数には大きな違いがあります。 C では、静的関数は、コンパイル先のオブジェクト ファイルである翻訳単位の外には表示されません。つまり、関数を静的にすると、その範囲が制限されます。静的関数は、その *.c ファイルに対して「プライベート」であると考えることができます (厳密には正しくありませんが)。

C++ では、"静的" はクラスのメンバー関数とデータ メンバーにも適用できます。静的データメンバーは「クラス変数」とも呼ばれ、非静的データメンバーは「インスタンス変数」と呼ばれます。これは Smalltalk の用語です。これは、クラスのすべてのオブジェクトが共有する静的データ メンバーのコピーは 1 つだけであり、各オブジェクトには非静的データ メンバーの独自のコピーがあることを意味します。したがって、静的データ メンバーは本質的にグローバル変数であり、クラスのメンバーです。

非静的メンバー関数は、クラスのすべてのデータ メンバー (静的および非静的) にアクセスできます。静的メンバー関数は、静的データ メンバーでのみ操作できます。

これについて考える 1 つの方法は、C++ では静的データ メンバーと静的メンバー関数はどのオブジェクトにも属さず、クラス全体に属していることです。


C++ の関数に関しては、キーワード static には 2 つの用途があります。

1 つ目は、関数を内部リンケージとしてマークして、他の翻訳単位で参照できないようにすることです。この使用法は、C++ では非推奨です。この用途には、名前のない名前空間が推奨されます。

// inside some .cpp file:

static void foo();    // old "C" way of having internal linkage

// C++ way:
namespace
{
   void this_function_has_internal_linkage()
   {
      // ...
   }
}

2 番目の使用法は、クラスのコンテキストです。クラスに静的メンバー関数がある場合、それは関数がクラスのメンバーであることを意味します (そして、他のメンバーへの通常のアクセスを持っています) が、特定のオブジェクトを介して呼び出す必要はありません。つまり、その関数内には「this」ポインターはありません。