为什么C中函数的原型和定义可能不同?

时间:2012-07-25 09:07:09

标签: c

我想知道为什么要编译:

int test();

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

为什么编译器不会发出任何错误/警告(我试过clang,gcc)? 如果我更改返回值它将无法编译 - 但参数可能不同?!

2 个答案:

答案 0 :(得分: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();只是声明了一个带有任何参数的函数(因此与test的后续定义兼容),而int test(void);是一个实际的函数原型,它声明了一个带 no 参数的函数( 与后续定义不兼容)。

答案 1 :(得分:15)

 int test();

在函数声明中,没有参数意味着该函数采用了未指定数量的参数。

这与

不同
 int test(void);

表示该函数不带参数。

没有参数的函数声明是旧的C函数声明; C将这种风格标记为过时并且不鼓励使用它。简而言之,不要使用它。

在您的情况下,您应该使用带有正确参数声明的函数声明:

 int test(void *data);