繁体   English   中英

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

[英]Why prototype and definition of a function in C may differ?

我想知道为什么这会编译:

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM