C 言語の静的関数のプロトタイプには static キーワードが必要ですか? 質問する

C 言語の静的関数のプロトタイプには static キーワードが必要ですか? 質問する

Cプログラミングの本には、静的関数を作成する場合は、関数の前にstaticキーワードを置く必要があると書いてあります。意味プロトタイプについては明示的に何も言及されていません。また、例ではプロトタイプを使用せず、静的関数をファイルの先頭に配置するだけです (そのため、プロトタイプは必要ないと思われます)。

では、静的関数にはプロトタイプにstaticキーワードが必要なのでしょうか?それとものみ定義の前に置くのですか?

ベストアンサー1

いいえ。関数宣言 (プロトタイプまたは定義) は、staticを使用した同じ関数の別の宣言の後に来る場合、キーワードを省略できますstatic

static関数の宣言が 1 つある場合、その最初の宣言は でなければなりませんstatic

これは ISO/IEC 9899:1999、6.7.1 で定義されています。

関数のファイル スコープ識別子の宣言にストレージ クラス指定子が含まれている場合static、その識別子には内部リンケージがあります。

[...]

その識別子の以前の宣言が可視であるスコープ内でストレージ クラス指定子を使用して宣言された識別子のextern場合、以前の宣言で内部または外部のリンケージが指定されていると、後の宣言での識別子のリンケージは、以前の宣言で指定されたリンケージと同じになります。

[...]

関数の識別子の宣言にストレージ クラス指定子がない場合、そのリンクは、ストレージ クラス指定子を使用して宣言された場合とまったく同じように決定されますextern

[...]

翻訳単位内で、同じ識別子が内部リンクと外部リンクの両方に出現した場合、動作は未定義になります。

したがって、例えばこれは有効です:

static void foo(void);
void foo(void);
static void foo(void) { }

これも:

static void foo(void) { }
void foo(void);

static void bar(void);
void bar(void) {}

しかし、このコードは間違っています:

void foo(void);
static void foo(void) { }

static通常、プロトタイプにもが含まれます(通常はプロトタイプが最初に来るため)。

おすすめ記事