11

staticは C でオーバーロードされたキーワードであることはわかっています。ここでは、内部リンケージを強制するためのキーワードとしての使用にのみ関心があります。

ファイルで宣言されたグローバル変数がある場合、使用する場合と使用しない場合.cの違いは何ですか? いずれにせよ、他のファイルは変数にアクセスできないため、変数は基本的に、 static キーワードの有無にかかわらず、ファイルに対して「プライベート」です。staticstatic.c

たとえば、 filefoo.cがあり、グローバル変数を宣言するとします。

int x = 5;

その変数xは、内部のコードでのみ使用できますfoo.c(もちろん、共有ヘッダー ファイルでexternキーワードを使用して宣言しない限り)。しかし、ヘッダー ファイルで宣言しないと、次のように入力した場合の違いは何になるでしょうか。

static int x = 5.

いずれにせよ、xここには内部リンケージがあるようです。だから私はstaticこの点での目的について混乱しています。

4

2 に答える 2

13

ファイルで宣言されたグローバル変数がある場合、使用する場合と使用しない場合.cの違いは何ですか? いずれにせよ、他のファイルは変数にアクセスできません [...]staticstatic.c

別のファイルで次のように宣言 xできます。

extern int x;

これにより、コード参照xをコンパイルできるようになり、リンカーはそれらの参照をx見つけたものに喜んでリンクします。

staticx翻訳単位の外側に表示されないようにすることで、これを防ぎます。

于 2010-08-19T19:44:23.103 に答える
6

いわば、C には「名前空間」が 1 つしかありません。「static」キーワードがないと、「x」という名前を使用する別のファイルから保護されません (独自のライブラリのヘッダーで表示しない場合でも)。

非静的変数を含むいくつかの C ファイルを一緒にリンクしてみてx(各ファイル内の関数からの読み取りアクセスと書き込みアクセスをインターリーブします)、これらの変数が静的に宣言されている状況と比較してください。

于 2010-08-19T19:43:32.260 に答える