なぜこれがコンパイルされるのか疑問に思っています:
int test();
int main() { return test((void*)0x1234); }
int test(void* data) { return 0; }
コンパイラがそれについてエラー/警告を出さないのはなぜですか (私はclang、gccを試しました)? 戻り値を変更するとコンパイルされませんが、引数が異なる場合があります?!
なぜこれがコンパイルされるのか疑問に思っています:
int test();
int main() { return test((void*)0x1234); }
int test(void* data) { return 0; }
コンパイラがそれについてエラー/警告を出さないのはなぜですか (私はclang、gccを試しました)? 戻り値を変更するとコンパイルされませんが、引数が異なる場合があります?!
変更する場合:
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);
int test();
関数宣言では、パラメーターがないということは、関数が指定されていない数の引数を取ることを意味します。
これは
int test(void);
これは、関数が引数を取らないことを意味します。
パラメーターのない関数宣言は、古い C スタイルの関数宣言です。C は、このスタイルを廃止済みとしてマークし、その使用を思いとどまらせます。要するに、使用しないでください。
あなたの場合、正しいパラメーター宣言で関数宣言を使用する必要があります。
int test(void *data);