web-dev-qa-db-ja.com

Cのvoidとstatic void関数の違いは何ですか?

2つの[〜#〜] c [〜#〜]ファイルがあります。

file1.c

int main()
{
  func(); 
  return 0;  
}

file2.c

static void func(void)
{
  puts("func called");
}

しかし、コマンドcc file2.c file1.cを使用して上記のコードをコンパイルすると、次のようになります。

undefined reference to `func'
collect2: error: ld returned 1 exit status

しかし、file2.c内のstaticキーワードを削除し、コマンドcc file2.c file1.cで上記のコードをコンパイルすると、正常に実行されます。

だから、私は質問がありますCのvoid関数と静的void関数の違いは何ですか?

13
msc

Cのvoid関数とstatic void関数の違いは何ですか?

本当の質問は、staticnon-static関数の違いは何でしょうか? (戻り値の型voidは無関係です。intまたはその他のいずれでも構いません)。

staticキーワードはやや使いすぎです。関数に適用される場合、その関数には 内部リンケージ が含まれることを意味します。つまり、そのスコープは 翻訳単位 (ソースファイルとして)内に制限されます。

デフォルトでは、関数は静的ではなく、外部リンケージがあります。この関数は、別のソースファイルで使用できます。

あなたの場合、static funcは他のソースファイルでは使用できないため、エラーが発生します。


いつstatic関数を使用する必要がありますか?

static関数は通常、より大きなプロジェクトで名前の競合を避けるために使用されます。 drivers/netの例のLinuxカーネルソースを調べると、そこに多くのstatic void関数があります。ドライバーはさまざまなベンダーによって開発されており、static関数を使用することで、他の関係のないドライバー開発者との名前の競合を心配することなく、好きな方法で名前を付けることができます。

28
artm