なぜこれがコンパイルされるのか疑問に思います:
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);
いいえパラメータ(そしてない以降の定義と互換性があります。