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関数の違いは何ですか?
Cのvoid関数とstatic void関数の違いは何ですか?
本当の質問は、static
とnon-static
関数の違いは何でしょうか? (戻り値の型void
は無関係です。int
またはその他のいずれでも構いません)。
static
キーワードはやや使いすぎです。関数に適用される場合、その関数には 内部リンケージ が含まれることを意味します。つまり、そのスコープは 翻訳単位 (ソースファイルとして)内に制限されます。
デフォルトでは、関数は静的ではなく、外部リンケージがあります。この関数は、別のソースファイルで使用できます。
あなたの場合、static func
は他のソースファイルでは使用できないため、エラーが発生します。
いつstatic
関数を使用する必要がありますか?
static
関数は通常、より大きなプロジェクトで名前の競合を避けるために使用されます。 drivers/net
の例のLinuxカーネルソースを調べると、そこに多くのstatic void
関数があります。ドライバーはさまざまなベンダーによって開発されており、static
関数を使用することで、他の関係のないドライバー開発者との名前の競合を心配することなく、好きな方法で名前を付けることができます。