我想知道为什么这会编译:
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);