5

次のコードを想定します。

extern int foo(void);

static int foo(void)
{
        return 0;
}

GCC でコンパイルしてみる

$ gcc -Wall -std=c99 1.c 
1.c:3:12: error: static declaration of ‘foo’ follows non-static declaration
1.c:1:12: note: previous declaration of ‘foo’ was here
1.c:3:12: warning: ‘foo’ defined but not used [-Wunused-function]

では、どのように静的関数を宣言できますか?

4

4 に答える 4

20

関数で宣言が機能externしないのはなぜstaticですか?

なぜならextern、 は外部結合static示し、 は内部結合を示すからです。明らかに、両方を同じ機能にすることはできません。

簡単に言えば、static関数で使用するときは、この関数のスコープをこの翻訳単位のみに制限し、別の翻訳単位から誰もアクセスできないようにするようコンパイラに指示します。
関数宣言はexternデフォルトですが、extern明示的に指定すると、コンパイラに、「他の翻訳単位からの全員がこの関数にアクセスできるようにしてください」と伝えます。
明らかに、コンパイラは両方を行うことはできません。

そのため、関数を翻訳単位でのみ表示するかどうかを選択してください。
以前の場合は作成しstaticて忘れてくださいextern。後者の場合は、static.

よく読んでください:
外部リンケージと内部リンケージとは何ですか?

上記の Q は C++ 用ですが、説明されている内容のほとんどは C にも当てはまります。

于 2012-12-09T13:56:08.903 に答える
4

あなたはそれを宣言しますstatic

static int foo(void);

static int foo(void)
{
        return 0;
}
于 2012-12-09T13:57:44.613 に答える
1

extern関数が別の翻訳単位 (ファイル) で定義されていることを意味します。 static定義されている翻訳単位でのみ使用されることを意味します。この 2 つは相互に排他的です。

于 2012-12-09T14:00:11.490 に答える