20

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

int test();

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

コンパイラがそれについてエラー/警告を出さないのはなぜですか (私はclang、gccを試しました)? 戻り値を変更するとコンパイルされませんが、引数が異なる場合があります?!

4

2 に答える 2

28

変更する場合:

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();を取る関数を宣言するためです (したがって、その後の の定義と互換性があります)が、実際の関数プロトタイプはパラメーターをとらない関数を宣言します (その後の定義とは互換性がありません)。testint test(void);

于 2012-07-25T09:10:57.563 に答える
15
 int test();

関数宣言では、パラメーターがないということは、関数が指定されていない数の引数を取ることを意味します。

これは

 int test(void);

これは、関数が引数を取らないことを意味します。

パラメーターのない関数宣言は、古い C スタイルの関数宣言です。C は、このスタイルを廃止済みとしてマークし、その使用を思いとどまらせます。要するに、使用しないでください。

あなたの場合、正しいパラメーター宣言で関数宣言を使用する必要があります。

 int test(void *data);
于 2012-07-25T09:09:19.730 に答える