为什么返回int的函数不需要原型?

我在 DevC++ 上试过这个程序,它会调用两种不同类型的函数,一种是返回int,一种是返回char。我很困惑为什么int函数不需要原型,而char一个和任何其他类型的函数都需要。

#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' ;
}

输出:

100B

如果我删除该char函数的原型,则会导致:

[Error] conflicting types for 'function2'
[Note] previous implicit declaration of 'function2' was here

回答

在 C 的旧时代,任何未明确声明的函数都应该int在您调用它时返回类型。如果编译器随后找到函数实现并看到int返回类型,则一切正常。如果该函数返回的不是int您在第二个函数中看到的错误消息,则返回任何其他内容。

此隐式int类型声明已从 C99 标准中删除。现在,当您使用没有原型的函数时,您至少应该从编译器那里得到警告。

如果您没有收到第一个函数的任何诊断消息,您应该在编译器中调高警告级别或切换到至少 C99 模式而不是旧版本。

编辑:函数定义中的空参数列表也是一个不推荐使用的功能。你不应该使用它。始终为每个具有返回类型和参数列表的函数提供原型。


回答

如果函数在声明之前使用,则该用法将成为该函数的隐式声明。当一个函数f被隐式定义时,赋予它的定义是int f(),即一个接受未指定数量的参数并返回一个 的函数int

函数的这种隐式定义与 的实际定义匹配,function1但不匹配function2。因此,以function1这种方式调用不会出错,但尝试以function2这种方式调用会导致隐式定义与实际定义不匹配,从而导致错误。

这种行为可以追溯到 C 的预标准化版本,其中所有对象(和函数的返回类型)都具有intif 未声明的默认类型。这在 C89 标准中仍然存在,但在 C99 标准中被删除,尽管一些编译器如 gcc 仍然支持这种过时的用法作为扩展。


以上是为什么返回int的函数不需要原型?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>