C の関数のプロトタイプと定義が異なるのはなぜですか? 質問する

C の関数のプロトタイプと定義が異なるのはなぜですか? 質問する

なぜこれがコンパイルされるのか疑問に思います:

int test();

int main() { return test((void*)0x1234); }
int test(void* data) { return 0; }

なぜコンパイラはそれに関するエラーや警告を出力しないのでしょうか (clang、gcc を試しました)? 戻り値を変更するとコンパイルされなくなりますが、引数は異なる可能性があります。

ベストアンサー1

変更する場合:

int test();

に:

int test(void);

予想通りのエラーが発生します:

foo.c:4: error: conflicting types for ‘test’
foo.c:1: error: previous declaration of ‘test’ was here

これは、int test();単に関数を宣言するだけで、どれでもは、パラメータを受け取る関数を宣言する実際の関数プロトタイプです(したがって、 のその後の定義と互換性がありますtest)。int test(void);いいえパラメータ(そしてない以降の定義と互換性があります。

おすすめ記事