![](/img/trans.png)
[英]Why does a declared prototype's function type not need to match the actual function's type?
[英]Why does a function that returns int not need a prototype?
我在 DevC++ 上尝试了这个程序,它会调用两种不同类型的 function,一种返回int
,一种返回char
。 我很困惑为什么int
function 不需要原型,而char
one 和任何其他类型的 function 需要原型。
#include <stdio.h>
//int function1();
char function2() ;
int main (){
int X = function1() ;
char Y = function2() ;
printf("%d", X) ;
printf ("%c", Y) ;
return 0 ;
}
int function1(){
return 100 ;
}
char function2(){
return 'B' ;
}
output:
100B
如果我删除char
function 的原型,则会导致:
[Error] conflicting types for 'function2'
[Note] previous implicit declaration of 'function2' was here
在 C 的旧时代,任何未明确声明的 function 在调用时都应该返回int
类型。 如果编译器随后找到 function 实现并看到一个int
返回类型,那么一切都很好。 如果 function 返回除int
以外的任何内容,您将收到错误消息,如您在第二个 function 中看到的那样。
这个隐式int
类型声明已从 C99 标准中删除。 现在,当您使用没有原型的 function 时,您至少应该从编译器中收到警告。
如果您没有收到任何第一个功能的诊断消息,您应该在编译器中调高警告级别或切换到至少 C99 模式而不是旧版本。
编辑:函数定义中的空参数列表也是不推荐使用的功能。 你不应该使用它。 始终为每个 function 提供原型,并提供返回类型和参数列表。
如果在声明之前使用 function,则该用法将成为 function 的隐式声明。 当隐式定义 function f
时,给它的定义是int f()
,即接受未指定数量的 arguments 的 function 并返回一个int
f()。
function 的隐式定义与function2
的实际定义匹配,但与function1
不匹配。 因此,以这种方式调用function1
不会出错,但尝试以这种方式调用function2
会导致隐式定义与实际定义不匹配,从而产生错误。
此行为可追溯到 C 的预标准化版本,其中所有对象(和函数的返回类型)如果未声明,则默认类型为int
。 尽管某些编译器(例如 gcc)仍然支持这种过时的用法作为扩展,但它仍然存在于 C89 标准中,但在 C99 标准中被删除。
它只是 C 最初设计时的一个古老遗物。 它实际上早在 C99 就被删除了,但许多编译器仍然支持这种类型的声明。 但不建议使用它。
我不确定它背后是否有任何真正的理由,但 C 深受语言 B 的启发。在 B 中,您不必指定函数的返回类型。 这实际上很有意义,因为只有一种类型, word
。
同样,您也不必指定变量的类型。 您仅指定它是否具有自动或 static 存储。 这就是 C 中完全无用的关键字auto
的来源。 这并不意味着与 C++ 中的相同。 它只是意味着“不是静态的”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.