繁体   English   中英

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

[英]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.

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