猿问

为什么没有参数的函数(与实际函数定义相比)编译?

为什么没有参数的函数(与实际函数定义相比)编译?

我刚刚遇到某人的C代码,我很困惑为什么要编译。有两点我不明白。

首先,与实际函数定义相比,函数原型没有参数。其次,函数定义中的参数没有类型。

#include <stdio.h>int func();int func(param){
    return param;}int main(){
    int bla = func(10);    
    printf("%d", bla);}

为什么这样做?我已经在几个编译器中测试过,它运行正常。


交互式爱情
浏览 638回答 3
3回答

呼唤远方

所有其他答案都是正确的,但只是为了完成函数以下列方式声明:&nbsp;&nbsp;return-type&nbsp;function-name(parameter-list,...)&nbsp;{&nbsp;body...&nbsp;}return-type是函数返回的变量类型。这不能是数组类型或函数类型。如果没有给出,则假定为int。function-name是函数的名称。parameter-list是函数用逗号分隔的参数列表。如果没有给出参数,那么该函数不带任何参数,应该用空的括号或用关键字void定义。如果参数列表中的变量前面没有变量类型,则假定为int。数组和函数不会传递给函数,但会自动转换为指针。如果列表以省略号(,...)结束,则没有设定数量的参数。注意:标头stdarg.h可用于在使用省略号时访问参数。再次为了完整起见。从C11规范6:11:6(第179页)的使用功能与空括号声明符(未原型格式参数类型说明符)是一个过时特征。

侃侃无极

在C中func()意味着您可以传递任意数量的参数。如果你不需要参数,那么你必须声明为func(void)。您传递给函数的类型,如果未指定,则默认为int。

一只甜甜圈

int func();从没有C标准的日子开始,这是一个过时的功能声明,即K&R C的日子(1989年之前,第一个“ANSI C”标准发布的那一年)。请记住,K&R C中没有原型,关键字void尚未发明。您所能做的就是告诉编译器函数的返回类型。K&R C中的空参数列表表示“未指定但固定”的参数数量。固定意味着您必须每次都使用相同数量的args&nbsp;调用该函数(与可变参数函数相反,例如printf,每次调用的数字和类型可能不同)。许多编译器会诊断出这个结构;&nbsp;特别gcc -Wstrict-prototypes会告诉你“函数声明不是原型”,这是一个现场,因为它看起来像一个原型(特别是如果你被C ++中毒!),但事实并非如此。这是一种旧式的K&R C返回型声明。经验法则:永远不要将空参数列表声明留空,用于int func(void)具体。这将K&R返回类型声明转换为适当的C89原型。编译器很高兴,开发人员很高兴,静态的跳棋很开心。那些被C ++误导的人可能会感到畏缩,因为他们在尝试锻炼外语时需要输入额外的字符:-)
随时随地看视频慕课网APP
我要回答