1. ホーム
  2. c

なぜgccは、引数なしと定義された関数に引数を渡すことができるのですか?

2023-10-07 12:05:37

疑問点

なぜこのコードがコンパイルされるのか理解できません。

#include <stdio.h>
void foo() {
    printf("Hello\n");
}

int main() {
    const char *str = "bar";
    foo(str);
    return 0;
}

gccは、私がfoo()にあまりにも多くの引数を渡しているという警告を投げさえしません。これは期待された動作なのでしょうか?

どのように解決するのですか?

C言語では、空のパラメータリストで宣言された関数は、呼び出されたときに任意の数の引数を受け付け、それらは通常の算術演算のプロモションの対象となります。 提供された引数が関数の定義に適切であることを確認するのは、呼び出し側の責任です。

引数ゼロの関数を宣言するには、以下のように記述します。 void foo(void); .

これは歴史的な理由によるもので、元々Cの関数はプロトタイプを持たず、Cが次のように進化してきたためです。 B から発展し、型付けなしの言語となったためです。 プロトタイプが追加されたとき、後方互換性のために元の型なしの宣言が言語に残されました。

空のパラメータリストについてgccが警告を出すようにするには -Wstrict-prototypes :

引数の型を指定せずに関数が宣言または定義された場合に警告を表示します。(古い形式の関数定義は、引数の型を指定した宣言が先行していれば、警告を出さずに許可されます)。