为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
交互式爱情 2019-07-25 19:45:49
为什么没有参数的函数(与实际函数定义相比)编译?我刚刚遇到某人的C代码,我很困惑为什么要编译。有两点我不明白。首先,与实际函数定义相比,函数原型没有参数。其次,函数定义中的参数没有类型。#include <stdio.h>int func();int func(param){     return param;}int main(){     int bla = func(10);         printf("%d", bla);}为什么这样做?我已经在几个编译器中测试过,它运行正常。
查看完整描述

3 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

所有其他答案都是正确的,但只是为了完成

函数以下列方式声明:

  return-type function-name(parameter-list,...) { body... }

return-type是函数返回的变量类型。这不能是数组类型或函数类型。如果没有给出,则假定为int

function-name函数的名称

parameter-list是函数用逗号分隔的参数列表。如果没有给出参数,那么该函数不带任何参数,应该用空的括号或用关键字void定义。如果参数列表中的变量前面没有变量类型,则假定为int。数组和函数不会传递给函数,但会自动转换为指针。如果列表以省略号(,...)结束,则没有设定数量的参数。注意:标头stdarg.h可用于在使用省略号时访问参数。

再次为了完整起见。从C11规范6:11:6(第179页)

使用功能与空括号声明符(未原型格式参数类型说明符)是一个过时特征


查看完整回答
反对 回复 2019-07-25
?
侃侃无极

TA贡献2051条经验 获得超10个赞

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


查看完整回答
反对 回复 2019-07-25
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

int func();从没有C标准的日子开始,这是一个过时的功能声明,即K&R C的日子(1989年之前,第一个“ANSI C”标准发布的那一年)。

请记住,K&R C没有原型,关键字void尚未发明。您所能做的就是告诉编译器函数的返回类型。K&R C中的空参数列表表示“未指定但固定”的参数数量。固定意味着您必须每次都使用相同数量的args 调用该函数(与可变参数函数相反,例如printf,每次调用的数字和类型可能不同)。

许多编译器会诊断出这个结构; 特别gcc -Wstrict-prototypes会告诉你“函数声明不是原型”,这是一个现场,因为它看起来像一个原型(特别是如果你被C ++中毒!),但事实并非如此。这是一种旧式的K&R C返回型声明。

经验法则:永远不要将空参数列表声明留空,用于int func(void)具体。这将K&R返回类型声明转换为适当的C89原型。编译器很高兴,开发人员很高兴,静态的跳棋很开心。那些被C ++误导的人可能会感到畏缩,因为他们在尝试锻炼外语时需要输入额外的字符:-)


查看完整回答
反对 回复 2019-07-25
  • 3 回答
  • 0 关注
  • 637 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信