2011-10-18 6 views
5

は私が宣言静的関数の利点は何ですか?

static int *foo(); 

ので、それはintへのポインタを返す静的な関数としてのfooを宣言belowsの見てきた1つのプロジェクトのソースコードに参照してください。ここで私はあなたに静的な関数宣言の目的は何ですか?

+0

lol @James: 'static double *** bzzzt();' – pmg

答えて

9

関数の名前は、宣言されている翻訳単位(ソースファイル)の外側には表示されず、別のソースファイル内の別の関数fooと競合しません。

一般に、別のソースファイルから特定の呼び出しが必要な場合を除いて、関数はおそらくstaticと宣言されます。

(が表示されていないだけでだということに注意してください。それはまだポインタを経由してプログラムのどこからでも呼び出すことができます。)

+0

ポインタでどのように呼び出すことができますか? –

+0

@ Mr.32 "関数ポインタ"を検索します。 – cnicutar

+1

関数を静的としてマークすることと、ヘッダーに単に関数を含めないことの違いは何ですか?ヘッダーからそれを省略しないでも同じ効果がありますか?または、ヘッダーに何かを入れず、それを静的とマークしない理由はありますか? – Alex

2

他の翻訳単位(.cファイル)がその機能を認識しないようにします。物事をきれいに整えます。 staticのない関数は、デフォルトではexternです(他のモジュールからも見えます)。

+0

..... –

+0

@JamesMcNellisが編集されました。 – cnicutar

1

関数をstaticと宣言すると、他のファイルにアクセスできなくなります。言い換えれば、宣言されたファイルだけが可視です。 「ローカル」機能。

C言語のstatic(関数宣言キーワード、変数ではない)をオブジェクト指向言語のprivateとして関連付けることもできます。

たとえば、hereを参照してください。

+1

質問は[tag:c]についてです。 「クラス」とは何ですか? –

+0

私はもっとCに関心があります...私はクラスとC++を知らない –

+1

@Keith:謝罪 - 先月Javaでのみコーディングされました。 –

1

staticがにそれが見えなくなりますよう関数やグローバル変数をマーキング現在の翻訳単位がオブジェクトファイルにコンパイルされると、リンカーに渡されます。

つまり、現在の翻訳単位内に内部リンケージしかありません。 staticを使用しない場合、または明示的にexternストレージクラス指定子を使用する場合、シンボルには外部リンケージがあります。 C99標準から

2

:識別さERS

6.2.2リンケージオブジェクトまたは関数でWiFiルスコープ識別子の宣言が静的ストレージクラス特異的ERが含まれている場合、識別子は内部のリンケージを持っています。プログラム全体を構成する翻訳単位とライブラリのセットで

、外部結合を持つ特定の識別子の各々 宣言が同じオブジェクトまたは 関数です。 1つの翻訳単位内では、内部識別子が の識別子の宣言は、同じオブジェクトまたは関数を示します。 リンケージのない識別子の各宣言は、一意のエンティティを示します。

関連する問題